2013-01-14 28 views
1

经过几个星期的使用rails应用程序并完成rails教程后,我想了解一些web应用程序中常见的Web攻击。未验证CSRF令牌的真实性时,无法重置用户会话

我设法在.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上运行Railstudio git代码的攻击刚刚安装,我遇到了完全相同的问题:会话未被重置,因为它应该是。这意味着教程应用程序容易受到这种攻击。

我深入了解代码(http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-reset_session),但无法弄清楚为什么在上下文中Railstutorial它没有似乎工作。

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

感谢您的帮助。

回答

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 
相关问题