Защита CSRF с помощью HTTP GET-запросов в Rails - PullRequest
9 голосов
/ 25 февраля 2012

Я понимаю, что Rails по умолчанию не имеет CSRF защиты для HTTP GET запросов, потому что утверждает, что они идемпотентны. Тем не менее, есть конфиденциальная информация, которая возвращается пользователю из этих запросов GET, и я бы не хотел, чтобы вредоносный сайт получал эту информацию.

Каков наилучший способ защиты HTTP GET запросов от CSRF в Rails?

1 Ответ

9 голосов
/ 07 марта 2012

Чтобы прочитать ответ на запрос CSRF-атаки, злоумышленнику потребуется заставить жертву выполнить свой код JavaScript. И в этом случае доступ будет ограничен некоторыми Одинаковыми политиками происхождения .

Если предположить, что атакующий запрос действительно перекрестное происхождение , Политика одинакового происхождения для DOM запрещает доступ через DOM (например, при внедрении с использованием iframe) и Кросс-запрос Общий ресурс источника (CORS) регулирует запросы между источниками через XMLHttpRequest следующим образом:

Если запрос является простым перекрестным запросом , т.е. е. простой метод только с простыми полями заголовка , тогда этот запрос будет отправлен (аналогично CSRF на основе HTML). Но доступ к ответу простого запроса между источниками зависит от того, позволяет ли ответ совместно использовать ресурсы .

Для других запросов из разных источников требуется так называемый предварительный просмотр перед отправкой фактического запроса. Этот запрос отправляется для проверки того, разрешает ли сервер запросы от источника, из которого отправляется предпечатная проверка. И только если предварительная проверка успешна и ответ на фактический запрос позволяет совместное использование ресурсов, к ответу можно получить доступ.

Итак, сделаем вывод: если ваш сервер не поддерживает CORS и явно не разрешает совместное использование с любым другим источником (т. Е. Access-Control-Allow-Origin: *), ответ CSRF - если запрос вообще был разрешен - не будет читаемым атакующим сайт.

...