问题描述
# This is the method that defines the application behavior when a request is found to be unverified.
# By default,Rails resets the session when it finds an unverified request.
def handle_unverified_request
reset_session
end
看到了这种解释
现在我的问题是,何时以及如何使每个请求有时无法验证?怎么样呢?以及何时。
谢谢,我试图进行搜索,但是我看到的解释如此深入,因此我可以轻松理解
解决方法
Rails添加CSRF真实性令牌以形成提交。
如果您的浏览器中有一个由Rails生成的表单,并且您检查了它,就会看到类似以下的内容:
<input type="hidden" name="authenticity_token" value="/LV6706J3W++oCASgg8+wuySgIksE9BNjamMbMW8Zv+G039yyxbpcRpUlUzuVbVvodKtDnUbknwo+jsBzsoO8g==">
Rails在表单提交时检查此隐藏标签,以确保它与Rails首先生成的表单相同。这有助于防止CSRF attacks
如果该字段的值与Rails期望的值不匹配,则转到您提到的handle_unverified_request
方法。
不仅仅是表单,Rails可以add tokens to the session确保它可以将请求匹配到活动会话。
不管来源如何,如果Rails出现不匹配,它都希望将其作为安全威胁来处理。
从本质上讲,Rails问您“当我认为收到的请求未经验证并可能受到攻击时该怎么办?”
在这种情况下,Rails将reset_session
注销current_user
。
在您可能需要做一些奇怪的事情时,Rails允许您关闭或限制CSRF保护,但是在我所熟悉的任何情况下都不建议这样做。
您可以通过更改链接的SO帖子中提到的protect_from_forgery
上的选项来做到这一点。
def handle_unverified_request
reset_connection
# validate only for html submit and not for ajax
if request.post? && !request.xhr? && request.content_type != 'multipart/form-data'
redirect_to controller: 'logout',action: 'index',is_invalid_token: true
end
return
end
然后我注销了控制器
if !params[:is_invalid_token].nil?
flash[:notice] = "You dont have access with this."
flash[:notice_header] = 'Forbidden Access'
end
redirect_to :controller => 'login',:action => 'index'