Rails 3 protect_from_forgery无法正常工作?

时间:2011-05-22 19:01:21

标签: ruby-on-rails csrf protect-from-forgery

我正在使用Rails 3.0.2,默认情况下在application_controller.rb中有protect_from_forgery

我想触发InvalidAuthenticityToken
要做到这一点,我已将此javascript添加到我的页面:

$('input[name=authenticity_token]').val('aaa')

使用Firebug检查DOM我看到authenticity_token隐藏字段已正确更新。

如果我提交表单并从服务器检查日志,我会看到相对参数已正确设置为'aaa'。我会期望在处理请求时获得InvalidAuthenticityToken,因为它是正确的!

这怎么可能?

2 个答案:

答案 0 :(得分:12)

真实性令牌/ csrf行为的文档已过期。在这些情况下不再抛出InvalidAuthenticityToken异常,而是重置您的会话。如果您希望以不同方式(或旧方法)处理此问题,您可以在控制器上的handle_unverified_request中定义自己的行为。

答案 1 :(得分:1)

我还认为你必须重置驻留在你的表单所在的html页面的元标记中的真实性标记(我假设你在那里有<%= csrf_meta_tag%>)。 Rails检查表单中的任何一个令牌(您在上面的javascript中更改过)或html页面的元标记中的令牌是否与Rails的预期真实性令牌匹配,如果其中任何一个匹配,那么您的InvalidAuthenticityToken赢了“被触发....