有时何时以及如何发现请求未得到验证红宝石在轨道上3.2

问题描述

# 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 4 Authenticity Token

看到了这种解释

现在我的问题是,何时以及如何使每个请求有时无法验证?怎么样呢?以及何时。

谢谢,我试图进行搜索,但是我看到的解释如此深入,因此我可以轻松理解

解决方法

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'