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 выиграл ' не может быть вызвано....

Другие вопросы по тегам