2010-10-29 122 views
1

我使用Rails request_forgery_protection机制来保护我的POST操作免受CSRF攻击和验证码以保护GET操作。这样,如果有人在一个会话中进行两阶段攻击,用当前令牌获取表单,然后用该令牌发送伪造请求,他最终将面临验证码检查。rails csrf令牌生存期

虽然我坚持这样做,因为Rails直到会话结束才重新生成CSRF令牌。这对我来说看起来不太合适,我认为在下一个动作之前应该更新令牌。我在想,也许我调整了一些错误?有没有另外一种方法呢?

谢谢。

回答

0

如果不为每个页面请求重新生成表单令牌,这种保护是不好的。我前一段时间遇到过这个问题(测试Redmine时,它是基于RoR的),并报告了这个问题,但没有重新测试。

如果还没有重新生成,我建议你向RoR团队报告。

+0

我很高兴我们同意一个持久性的标记是没用的:)虽然RoR团队修复了它,但我真的不明白它如何在没有对网站架构施加严重限制或在安全性方面留下空白的情况下工作。恐怕我不得不依靠验证码。 – krukid 2010-11-08 20:42:45

+1

请注意,为每个请求重新生成标记对可用性有一定影响(例如,返回不起作用),请参阅:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#General_Recommendation %3a_Synchronizer_Token_Pattern – hellvinz 2014-02-04 11:00:48

1

我不确定这是不是一个好主意,但是你可以在你的应用程序控制器中获取请求时自行清除令牌。

before_filter :reset_csrf 


private 
def reset_csrf 
    session[:_csrf_token] = nil if request.get? 
end 
+1

我的想法,除了你不能使用它,如果你的网页发送多个AJAX GET请求(例如用户状态更新),所以我会去“...如果request.get?而不是request.xhr? ”。唉,我不能,因为如果你在两个选项卡上都有表单并打算使用它们,那么这种方法仍然会打破多标签(多窗口)导航。除了XHR可以很容易被欺骗,这将为稍微聪明的攻击者留下一个安全漏洞。我开始认为CSRF保护不起作用。 – krukid 2010-11-02 09:01:22

+0

是的,我知道你最后的意思。对不起,我没有更多的建议,提供CSRF – jwarchol 2010-11-03 03:53:46

+0

我也得到这一点,保持多个标签工作是重要的。我的安全知识很少报告一些事情。我使用一个非常微弱的JS验证码,只是为了阻止垃圾邮件机器人:http://fabianosoriani.wordpress.com/2011/06/15/very-simple-invisible-javascript-rails-captcha/ – 2011-08-01 15:31:29