【问题标题】:rails csrf token lifetimerails csrf 令牌生命周期
【发布时间】:2011-05-02 08:40:09
【问题描述】:

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

不过,我仍然坚持这一点,因为 Rails 直到会话结束才会重新生成 CSRF 令牌。这对我来说似乎不对,我认为应该在下一步行动之前更新令牌。我想知道也许我调整了错误?还有其他方法吗?

谢谢。

【问题讨论】:

    标签: ruby-on-rails security csrf


    【解决方案1】:

    我不确定这是否是个好主意,但您可以在应用程序控制器内部的 get 请求中自己取消令牌。

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

    【讨论】:

    • 我的想法完全一样,除非您的页面发送多个 AJAX GET 请求(例如用户状态更新),否则您不能使用它,所以我会选择“...if request.get? and不是 request.xhr?”。唉,我不能,因为如果您在两个选项卡上都有表单并打算使用它们,那么这种方法仍然会破坏多选项卡(多窗口)导航。此外,XHR 很容易被欺骗,这将有效地为稍微更聪明的攻击者留下一个安全漏洞。我开始认为 CSRF 保护不起作用。
    • 没错,我知道你最后一点的意思。抱歉,我没有更多关于 CSRF 的建议
    • 我也明白这一点,保持多个标签工作很重要。我的安全知识很少,无法报告有关它的内容。我使用了一个非常弱的 JS 验证码,只是为了阻止垃圾邮件机器人:fabianosoriani.wordpress.com/2011/06/15/…
    【解决方案2】:

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

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

    【讨论】:

    • 我很高兴我们同意持久性令牌是无用的 :) 尽管即使 RoR 团队修复了它,但我真的看不出它如何在不对站点架构或留下安全漏洞。恐怕我不得不更多地依赖验证码。
    • 请注意,为每个请求重新生成令牌对可用性有一些影响(例如,返回不起作用)请参阅:owasp.org/index.php/…
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2019-06-17
    • 2017-07-25
    • 2020-11-06
    • 2016-05-15
    • 2018-10-26
    相关资源
    最近更新 更多