Dav*_*ips 21 ruby ruby-on-rails ruby-on-rails-3
InvalidAuthenticityToken当CSRF令牌不匹配时,Rails会引发一个.但是,从阅读来源,我无法弄清楚这是如何实际发生的.我首先为该类修饰树:
$ ack --ignore-dir=test InvalidAuthenticityToken
actionpack/lib/action_controller/metal/request_forgery_protection.rb
4: class InvalidAuthenticityToken < ActionControllerError #:nodoc:
17: # which will check the token and raise an ActionController::InvalidAuthenticityToken
actionpack/lib/action_dispatch/middleware/show_exceptions.rb
22: 'ActionController::InvalidAuthenticityToken' => :unprocessable_entity
Run Code Online (Sandbox Code Playgroud)
只有两次点击,忽略了评论.第一个是类定义:
class InvalidAuthenticityToken < ActionControllerError #:nodoc:
end
Run Code Online (Sandbox Code Playgroud)
第二个是将异常转换为HTTP状态代码.通过调用protect_from_forgery控制器来启用CSRF保护,让我们看一下:
def protect_from_forgery(options = {})
self.request_forgery_protection_token ||= :authenticity_token
before_filter :verify_authenticity_token, options
end
Run Code Online (Sandbox Code Playgroud)
它添加了一个过滤器:
def verify_authenticity_token
verified_request? || handle_unverified_request
end
Run Code Online (Sandbox Code Playgroud)
验证失败时会调用此函数:
def handle_unverified_request
reset_session
end
Run Code Online (Sandbox Code Playgroud)
那么InvalidAuthenticityToken实际上是如何提出的?
wup*_*tah 22
最近的行为发生了变化,但文档尚未更新.使用的新方法是假设会话已被劫持,因此清除会话.假设你的会话包含此请求的所有重要的认证信息(就像你在为记录的事实alice)和控制器保证了用户进行身份验证的这个动作,您的请求将被重定向到登录页面(或者无论您选择处理未登录的用户).但是,对于未经过身份验证的请求(如注册表单),请求将使用空会话.
似乎这个提交还继续关闭CSRF漏洞,但我没有读到详细信息.
要获得旧行为,您只需定义此方法:
def handle_unverified_request
raise(ActionController::InvalidAuthenticityToken)
end
Run Code Online (Sandbox Code Playgroud)
您可以在Ruby on Rails安全指南中阅读有关CSRF和其他Rails安全问题的更多信息.
verify_authenticity_token曾被定义为
verified_request? || raise(ActionController::InvalidAuthenticityToken)
Run Code Online (Sandbox Code Playgroud)
但正如你所指出的那样,它现在调用handle_unverified_request,而后者则调用reset_session
我不认为Rails实际上会抛出那个异常.
http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails states
应用此修补程序失败后,CSRF请求将不再生成HTTP 500错误,而是会重置会话.用户可以通过在自己的控制器中覆盖handle_unverified_request来覆盖此行为.
https://github.com/rails/rails/commit/66ce3843d32e9f2ac3b1da20067af53019bbb034
| 归档时间: |
|
| 查看次数: |
14733 次 |
| 最近记录: |