ОБНОВЛЕНИЕ: GWT 2.3 представляет лучший механизм для борьбы с нападениями на XSRF. См. http://code.google.com/webtoolkit/doc/latest/DevGuideSecurityRpcXsrf.html
Механизм RPC GWT делает следующие вещи на каждом Запросе HTTP -
Запросом HTTP всегда является POST, и на стороне сервера ДОБИРАЮТСЯ, методы выдают исключение (метод, не поддерживаемый).
Кроме того, если эти заголовки не установлены или имеют неправильное значение, обработку сбоев сервера за исключением "возможно CSRF?" или что-то к тому эффекту.
Вопрос: действительно ли это достаточно для предотвращения CSRF? Существует ли способ установить пользовательские заголовки и измениться, тип контента в чистом перекрестном сайте вызывают метод подделки?
Если этот GWT RPC используется браузером, то он на 100% уязвим для CSRF. Тип содержимого может быть задан в элементе html .
X-GWT-Permutation
и X-GWT-Module-Base
не входят в черный список запрещенных заголовков Flash. Таким образом, можно провести CSRF-атаку с помощью Flash. Единственный элемент заголовка, которому можно доверять для защиты от CSRF, - это "referer", но это не всегда лучший подход. Используйте защиту CSRF на основе токенов, когда это возможно.
Вот несколько эксплойтов, которые я написал и которые должны пролить свет на непонятную атаку, которую я описываю. Флеш-эксплойт для этого будет выглядеть примерно так здесь и здесь - это js/html-эксплойт, который изменяет тип содержимого.
Мой эксплойт был написан для Flex 3.2, правила изменились во Flex 4 (Flash 10) Вот последние правила, большинство заголовков могут быть манипулированы только для запросов POST.
Flash-скрипт, использующий navigateTo()
для CSRF:
https://github.com/TheRook/CSRF-Request-Builder
Я знаю, что задал этот вопрос, но примерно через несколько дней исследования (благодаря указателям от Rook!), Я думаю, что у меня есть ответ.
То, что GWT предлагает "из коробки", не защитит вас от CSRF. Вы должны предпринять шаги, описанные в Безопасность приложений GWT , чтобы оставаться в безопасности.
GWT RPC устанавливает заголовок content-type равным text / x-gwt-rpc; charset = utf-8. Хотя я не нашел способа установить это с помощью HTML-форм, это тривиально сделать во флэш-памяти.
Пользовательские заголовки - X-GWT-Permutation и X-GWT-Module-Base - немного сложнее. Их нельзя установить с помощью HTML. Кроме того, они не могут быть установлены с помощью Flash, если ваш сервер специально не разрешает это в crossdomain.xml. См. Безопасность Flash Player 10 .
Кроме того, если SWF-файл хочет отправлять пользовательские заголовки HTTP куда угодно , кроме своего собственного исходного хоста, должен быть файл политики на {{ 1}} HTTP-сервер, на который отправляется запрос . Этот файл политики должен перечислить хост SWF-файла с источником (или большим набором хостов) как , которому разрешено отправлять настраиваемые заголовки на этот хост. .
Теперь RPC GWT бывает двух видов. Существует старый RPC в формате пользовательской сериализации и новый де-RPC на основе JSON. AFAICT, клиентский код всегда устанавливает эти заголовки запроса. RPC старого стиля теперь не применяет эти заголовки на стороне сервера, поэтому возможна CSRF-атака. Новый стиль de-RPC принудительно применяет эти заголовки, и поэтому может или не может быть возможно атаковать их.
В целом, я бы сказал, что если вы заботитесь о безопасности, убедитесь, что вы отправляете надежные токены CSRF в своем запросе, и не полагайтесь на GWT, чтобы предотвратить это для вас.
Я не уверен, есть ли простой способ (мне бы тоже было очень интересно узнать об этом! ), но по крайней мере, похоже, есть некоторые продвинутые способы выполнения произвольных межсайтовых запросов с произвольными заголовками: http://www.springerlink.com/content/h65wj72526715701/ Я не купил статью, но аннотация и введение действительно звучат очень интересно.
Может быть, кто-нибудь здесь уже прочитал полную версию статьи и может немного дополнить ее?