未验证CSRF令牌真实性时,无法重置用户会话

时间:2013-01-14 08:59:04

标签: csrf railstutorial.org

使用rails应用程序并完成rails教程几周后,我想了解Web应用程序中的一些常见Web攻击。

我设法使用.html文件中的以下代码块执行CSRF攻击类型。

<form action="http://localhost:3000/users/2" method="post">
  <input type="hidden" name="_method" value="delete">
  <div>
    <input type="submit" value="Delete">
  </div>
</form>

以管理员身份登录后,我针对自己的代码运行攻击,该代码基于与Railtutorial相同的会话机制,并且我成功删除了因为缺少真实性令牌而应该停止的用户。

默认行为应该是会话重置,从而阻止用户在Web应用程序之外被删除。

我可以在日志中看到“无法验证CSRF令牌真实性”,但会话未重置。

覆盖handle_unverified_request方法,默认情况下应该使用

重置会话
def handle_unverified_request
  raise(ActionController::InvalidAuthenticityToken)
end

错误得到正确提升。

从railstutorial / sample_app_2nd_ed新安装的Railstutorial git代码上运行攻击,我遇到了完全相同的问题:会话未按原样重置。这意味着教程应用程序容易受到这种攻击。

我深入研究了代码(http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-reset_session),但无法弄清楚为什么在上下文中看起来它看起来并不像工作。

任何人都可以验证,如果tutiral确实容易受到CSRF的影响吗?如果是,那么解决方案是在这种情况下重写handle_unverified_request以进行适当的注销吗?最后为什么它不能正常工作?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果CSRF令牌无法验证,我会弄清楚如何强制退出用户。

这似乎与我们清空会话而不是cookie的记忆标记有关。

覆盖应用程序中的handle_unverified_request(以便所有控制器从中受益)并添加sign_out方法来清除记忆令牌。

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper

  def handle_unverified_request
    sign_out
    super
  end
end