Уязвимы ли веб-службы JSON для атак CSRF?
Я создаю веб-службу, которая использует JSON исключительно для своего содержимого запроса и ответа (т. е. без полезных нагрузок, закодированных в форме).
является ли веб-служба уязвимой для атаки CSRF, если верно следующее?
любой
POST
запрос без объекта JSON верхнего уровня, например,{"foo":"bar"}
, будет отклонен С 400. Например,POST
запрос с содержанием42
будет отвергнутый.любой
POST
запрос с типом контента, отличным отapplication/json
будет отклонен С 400. Например,POST
запрос с содержанием типаapplication/x-www-form-urlencoded
был бы таким образом отклонен.все запросы GET будут безопасное, и таким образом не изменять любые данные на стороне сервера.
клиенты аутентифицируются через cookie сеанса, который веб-служба дает им после того, как они предоставляют правильный пара имя пользователя / пароль через сообщение с данными JSON, например
{"username":"user@example.com", "password":"my password"}
.
вспомогательный вопрос: Are PUT
и DELETE
запросы когда-либо уязвимы для CSRF? Я спрашиваю, потому что кажется, что большинство (все?) браузеры запрещают эти методы в HTML-формах.
изменить: добавлен пункт #4.
EDIT: много хороших комментариев и ответов до сих пор, но никто не предложил конкретную атаку CSRF, к которой эта веб-служба уязвима.
5 ответов:
подделка произвольных запросов CSRF с произвольными типами носителей эффективно возможна только с XHR, потому что a метод формы ограничивается GET и POST и тело сообщения POST формы также ограничено тремя форматами
application/x-www-form-urlencoded
,multipart/form-data
иtext/plain
. Однако,с кодировкой данных формыtext/plain
по-прежнему можно подделывать запросы, содержащие действительные данные JSON.таким образом, единственная угроза исходит от атак CSRF на основе XHR. И они будут успешными только в том случае, если они либо
- запуск из того же источника, так что в основном с вашего собственного сайта как-то (например, XSS), или
- запуск из другого источника и ваш сервер разрешает такие запросы кросс-происхождения.
если вы можете устранить оба, ваш веб-сервис не уязвим для CSRF. По крайней мере, не те, которые выполняются через веб-браузер.
можно сделать CSRF на основе JSON Restful services с помощью Ajax. Я тестировал это в приложении (используя как Chrome, так и Firefox). Вы должны изменить contentType на text / plain и тип данных на JSON для того, чтобы avaoid предполетный запрос. Затем вы можете отправить запрос, но для отправки sessiondata вам нужно установить флаг withCredentials в вашем запросе ajax. Я обсуждаю это более подробно здесь (ссылки включено):
http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html
Да, это возможно. Вы можете настроить сервер злоумышленника, который отправит обратно перенаправление 307 на целевой сервер на машину жертвы. Вам нужно использовать flash для отправки сообщения вместо использования формы.
Ссылка:https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
Он также работает на Chrome.
У меня есть некоторые сомнения по поводу пункта 3. Хотя это можно считать безопасным, поскольку это не изменяет данные на стороне сервера, данные все еще могут быть прочитаны, и риск состоит в том, что они могут быть украдены.
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
является ли веб-служба уязвимой для атаки CSRF, если верно следующее?
да. Это все-таки по протоколу HTTP.
запросы PUT и DELETE когда-либо уязвимы для CSRF?
да
Кажется, что большинство (все?) браузеры запрещают эти методы в HTML-формах
вы думаете, что браузер-это единственный способ сделать HTTP-запрос?