【问题标题】:Work with authenticity token? Or disable it?使用真实性令牌?还是禁用它?
【发布时间】:2011-11-26 05:53:50
【问题描述】:

我的迷你网络设备会将数据样本提交到 RoR 应用程序,该应用程序会将它们添加到 MySQL 表中。

我想出了如何形成POST数据包,但我没有得到的是如何避免authentity-token问题。

有没有办法让我的小笨蛋获取正确的令牌并将其发回? (我猜不是,否则它不会是一个安全功能)。

这不是一个高度安全敏感的应用程序,所以我应该告诉这个页面完全忽略 authentity-token 吗?

它有望通过每个客户端(Web 设备)使用唯一的用户 ID 和密码登录这一事实进行身份验证,因此它会受到会话 ID 的保护。

如果我使用“松散”的语言,请随时纠正我。我是部署网站的新手。

Keb'm

【问题讨论】:

    标签: ruby-on-rails curl authenticity-token


    【解决方案1】:

    如果每个客户端都经过身份验证,则可以禁用真实性令牌,这表示您应该只针对该一项操作禁用它。

    skip_before_filter :verify_authenticity_token, :only => :create
    

    【讨论】:

    • 对于较新的 rails 版本(如 rails 6)skip_before_filter 应替换为 skip_before_action
    【解决方案2】:

    如果每个客户端都经过身份验证,则可以禁用真实性令牌

    仅当您使用除 http cookie 之外的其他身份验证机制时,这才是正确的。因为 您提到了“session_id”,我认为情况并非如此。

    使用标准 rails session_id cookie,将 user_id 存储在会话中和此操作 可以通过网络浏览器访问,它将受到 csrf 攻击。

    api 的最佳策略是实现自定义身份验证机制,某种身份验证令牌,与每个 http 标头一起发送。

    然后将 csrf 保护更改为 null_session 或者如果您不那么偏执,请禁用 如here 所述,完全为您的 api 请求提供 csrf 保护

    如果您仍然想为您的 api 坚持使用基于 cookie 的身份验证,您应该设置 将带有第一个 GET 请求的 csrf 身份验证令牌放入额外的 cookie。然后你读取这个 cookie 并将它的令牌作为“X-CSRF-Token”标头发送。 Rails 将在protect_from_forgery 方法中检查此标头,并且由于3d 方无法读取cookie,攻击者将无法伪造此请求。

    #application_controller.rb
    protect_from_forgery with: :exception
    after_action :set_csrf
    
    def set_csrf
     cookies['X-CSRF-Token'] = form_authenticity_token if protect_against_forgery?
    end
    
    # request session and x-csrf-toke
    # the cookies will be stored into cookie.txt
    curl -c cookie.txt http://example.com
    
    #curl post command
    curl -H "X-CSRF-Token: <token>" -b cookie.txt -d '{"item":{"title":"test"}}' "http://example.com/items.json"
    

    请参阅:verified_request? 方法以了解 rails 如何检查请求伪造。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2013-07-30
      • 2011-03-09
      • 2011-02-11
      相关资源
      最近更新 更多