Внутри одного из моих контроллеров я пишу следующее, чтобы защитить определенные страницы от CSRF.
protect_from_forgery :only => [:foo, :bar]
Когда я загружаю URL-адреса, соответствующие foo
и bar
, и просматриваю HTML, я не вижу никаких скрытых полей ввода или метатегов, содержащих токены безопасности, как описано здесь.
Однако во время тестирования я заметил, что CSRF
не эффективен против этих страниц, хотя он эффективен против других незащищенных страниц того же приложения.
Так где же Rails 4
хранит токен безопасности, который используется для проверки того, что запрос пришел с исходной страницы?
Обратите внимание, что я уже прочитал Руководство по безопасности Ruby On Rails и раздел protect_from_forgery
, это говорит
Это будет автоматически включать токен безопасности во все формы и запросы Ajax, сгенерированные Rails. Если маркер безопасности не соответствует ожидаемому, сеанс будет сброшен.
Проблема в том, что токен безопасности отсутствует в формах на страницах с включенной защитой CSRF, хотя CSRF действительно неэффективен против них.
Обратите внимание: этот код взят из проекта класса, в котором одной из целей является выполнение атаки clickjacking для обхода проекта CSRF. Вопрос, который я здесь задаю, ортогонален цели задания.
Мне просто любопытно, как именно Rails делает CSRF.
После выполнения rails server
напрямую соответствующий URL-адрес, для которого я не могу найти токен безопасности, — http://localhost:3000/protected_transfer
.