2014-01-22 7 views
6

Я разрабатываю RESTful API, используя php/symfony2.API CSRF и RESTful (symfony2, php)

Symfony2 поставляется с защитой CSRF из коробки и отлично работает при использовании данных нормальной формы (он передает токен CSRF в форму и, когда отправляется обратно, ожидает тот же токен, который встраивается в форму).

Тем не менее это решение не подходит для использования, если вы разрабатываете API RESTful, где мое сообщение между бэкендом < -> frontend чисто основано на JSON. Из-за этого я отключил CSRF.

Я знаю, что токен CSRF небезопасен, поэтому мне интересно, какой оптимальный способ иметь CSRF с RESTful API.

Одна идея состоит в том, чтобы иметь конкретный URL, например./api/generate/csrf, который может быть вызван интерфейсом, а затем добавить токен к запросу json. Это звучит не так, как самый безопасный способ в качестве токена технически может быть сгенерирован кем угодно.

Каков наилучший способ решения проблемы CSRF при разработке API RESTful.

Cheers, Ричард

+1

Какой клиент вы используете для API? Является ли это еще одной веб-службой, мобильным приложением или внешним клиентом (например, угловым/опорным/угловым). Если вы используете первый или второй вариант, ответы могут отличаться от последнего. –

+0

@Jurian Sluiman Клиент (интерфейс) является веб-сайтом (html5/js) на данный момент. Однако, возможно, потребуется и поддержка других устройств в будущем, поэтому я не хочу ограничивать себя веб-сайтом. –

ответ

1

Помните, что вам нужно только защиту от CSRF, когда клиент REST использует проверку подлинности на основе сеансов, в противном случае защита CSRF не поможет.

Если ваши запросы используют аутентификацию на основе сеанса, я бы включил токен CSRF в качестве заголовка. Что-то вроде:

CSRF-Token: dfsa0jr3n2io20a; 
+0

К сожалению, клиент REST использует аутентификацию на основе сеанса (я знаю, что это не идеально, но так оно и есть на данный момент). Я понимаю, что есть способы передать токен CSRF в качестве заголовка, но как его получить? получает один, вызывая, например./api/give/me/token - безопасная ставка? –

+0

Вы должны сгенерировать токен CSRF на сервере и поместить его на страницу. Затем, когда клиент выполняет запрос с этим токеном, вы уверены, что запрос пришел с этой страницы. Это идея. Рамки, подобные Symfony, делают это автоматически для вас для форм, но здесь у вас есть немного особенный случай, поэтому вы должны реализовать его самостоятельно. – rednaw

+0

все данные передаются от клиента как json. Бэкэнд не создает никаких форм для интерфейса в этом случае. Я знаю, что могу создать специальный звонок, например./api/token, который будет возвращать токен, который затем я могу добавить в json, который будет отправлен на сервер.проблема с этим решением заключается в том, что потенциальный злоумышленник также мог бы получить доступ/api/token для генерации токена и добавить к фальшивому json-запросу злоумышленника –

0

Я тоже работаю над этой проблемой. Вот мой original question.

У меня есть теоретическое решение до сих пор, но я не совсем уверен, что это сработает. Может быть, кто-то может прокомментировать.

  1. Добавить CSRF TOKEN в куки-файлы ответа API, доступные для чтения приложением JS;
  2. Отправьте его с запросом в виде значения заголовка X-CSRF-TOKEN приложением JS;
  3. Проверьте CSRF TOKEN на API.
Смежные вопросы