Rails 3 protect_from_forgery не работает правильно?
Я использую Rails 3.0.2, который имеет protect_from_forgery
по умолчанию в application_controller.rb.
Я хотел вызвать InvalidAuthenticityToken
,
Для этого я добавил этот JavaScript на свою страницу:
$('input[name=authenticity_token]').val('aaa')
Проверяя DOM с помощью Firebug, я вижу authenticity_token
скрытое поле корректно обновлено.
Если я отправляю форму и проверяю журнал с сервера, я вижу, что соответствующий параметр правильно установлен на "aaa". Я ожидал бы получить InvalidAuthenticityToken
пока запрос обрабатывается как был правильно!
Как это возможно?
2 ответа
Документация по поведению токена подлинности /csrf устарела. InvalidAuthenticityToken
исключение больше не выдается в этих случаях, вместо этого ваш сеанс просто сбрасывается. Если вы хотите работать с этим по-другому (или по-старому), вы можете определить свое собственное поведение в handle_unverified_request
на вашем контроллере.
Я также полагаю, что вам придется сбросить токен Authenticity, который находится в метатеге html-страницы, в которой находится ваша форма (я предполагаю, что у вас есть <% = csrf_meta_tag%> там). Rails проверяет, совпадает ли токен в форме (который вы изменили в своем javascript выше) или токен в метатеге html-страницы с ожидаемым токеном подлинности Rails, и если ЛЮБОЙ из них совпадает, то ваш InvalidAuthenticityToken выиграл ' не может быть вызвано....