【问题标题】:What is the difference between null_session and reset_session in Rails 4?Rails 4 中的 null_session 和 reset_session 有什么区别?
【发布时间】:2015-08-15 10:23:50
【问题描述】:

我目前正在与其他一些开发人员一起开发 Rails 应用程序,并且通过 Angular 通过 AJAX 向服务器发送 POST。有时,我们注意到一些InvalidAuthenticityToken 异常来自我们的电子邮件日志,这导致我们想要采取行动。

由于这个请求是通过 Angular 发出的,我认为我们将服务器视为 API,我们应该使用 protect_from_forgery with: :null_session。但是,protect_from_forgery with: :reset_session 似乎为我们提供了相同的分辨率。

我不希望仅仅因为推荐就盲目插入代码,所以我想知道这两种防伪方法之间的区别。我什么时候会使用其中一种,为什么我更喜欢使用它?

【问题讨论】:

标签: ruby-on-rails ruby angularjs


【解决方案1】:

根据我对代码的解释,似乎是:

  • null_session 应该用在 API 风格的控制器中,在这种控制器中你对会话对象没有用处。这听起来像是适合您的 Angular 应用程序的解决方案。用户先前存在的会话(即由其他传统控制器设置)将保持不变。如果您没有为protect_from_forgery 指定with 选项,这也是默认行为。
  • reset_session 用于传统控制器。当 CSRF 检查失败时,它告诉 Rails 清除用户的会话并继续处理请求。这听起来像是一种“偏执模式”,如果有任何篡改请求的证据,您希望将用户从您的应用中注销。

如果您的 Rails 应用根本不使用会话,那么它们是可以互换的。

但是,如果您确实在应用程序的某些部分使用会话而不是其他部分(即传统控制器和 API 控制器的混合),那么 null_session 可能是您应该使用的。否则,如果您使用reset_session,浏览器发出的 API 请求将导致用户退出浏览器会话。

【讨论】:

  • 这是有道理的。如果场景是这样的,这在更高的层次上应用;也就是说,如果这是在其他控制器继承的父控制器类中定义的,那么您所说的仍然成立吗?
  • 是的,例如,如果您的所有 API 控制器都从 API::BaseController 父类继承,那么您将把 protect_from_forgery with: :null_session 放在该基类中,它将适用于从它继承的所有控制器。您的非 API 控制器仍将获得 ApplicationController (with: :exception) 定义的默认行为。
  • 完美,这就是我想要的。谢谢你。
  • 我相信null_session 是默认值(不是上面的reset_session),根据这些文档:api.rubyonrails.org/classes/ActionController/…
  • @MattBrictson 那么如果我使用null_session,我该如何缓解来自我的 API 应用程序的 csrf 攻击?
【解决方案2】:

只是想补充一点我的发现,以更好地理解这 3 种策略。区别在于verify_authenticity_token 检查失败后会发生什么:

  • exception strategy 使您的应用崩溃
  • reset_session 策略完全删除用户会话
  • null_session 策略仅在请求期间使会话无效,并且应用仍继续执行。

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 2020-01-01
    • 2022-11-22
    • 2022-11-27
    • 2021-08-16
    • 2012-06-15
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多