2011-05-22 106 views
5

我使用Rails 3.0.2,默认情况下在application_controller.rb中有protect_from_forgeryRails 3 protect_from_forgery无法正常工作?

我想触发一个InvalidAuthenticityToken
要做到这一点我已经加入这个JavaScript到我的网页:

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

检查与萤火虫的DOM我看到authenticity_token隐藏字段正确更新。

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

这怎么可能?

+1

你应该接受答案,因为它解决了你的pb。 – apneadiving 2011-05-26 16:55:02

+0

重置会话不足以防止CSRF。在导轨4中,默认的对策是引发异常,这种异常更安全。 – 2015-10-02 11:48:07

回答

12

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

+0

非常感谢!我做到了,它完美的工作! – Diego 2011-05-24 06:04:14

1

我也相信你将不得不重置驻留在你的表单所在的html页面元标记中的真实性标记(我假设你有<%= csrf_meta_tag%>)。 Rails检查表单中的任何一个标记(你在上面的JavaScript中更改过)或HTML页面的元标记中的标记是否与Rails的预期真实性标记相匹配,并且如果它们中的任何一个匹配,则InvalidAuthenticityToken将赢得' t被触发....