【问题标题】:Weird thing when checking sessions in Rails on POST request在 POST 请求上检查 Rails 中的会话时发生奇怪的事情
【发布时间】:2012-03-17 03:56:13
【问题描述】:

我在 Rails 中遇到了一个奇怪的错误,我正在制作一个用户可以登录和上传文件的应用程序。一切正常,但是当我想上传任何文件时,我的应用程序控制器中用于检查活动会话的代码会失败,因为它无法访问会话数组:

def current_user
    if session[:session].nil? # <- Fails here
        redirect_to "/login"  
    else
        if session[:hash] == Digest::SHA512.hexdigest(session[:password]+" - "+session[:username]+" - "+session[:uuid]) #< and here (removing the other if) with NoMethodError
            return 0
        else
            redirect_to "/login"

        end

    end
end

这适用于其他事情,但显然会在 POST 请求上中断。这是我上传文件的 HAML 视图:

%b Upload

%form{:action=>"/u",:method=>"post",:enctype=>"multipart/form-data"}
    %br
    %input{:type=>"file",:name=>"file"}
    %input{:type=>"submit",:value=>"Upload"}

我做错了什么?同样在 POST 请求中,我在应用程序日志中获得:WARNING: Can't verify CSRF token authenticity

【问题讨论】:

    标签: ruby-on-rails ruby post request csrf


    【解决方案1】:

    以防万一有人决定在表单中使用 html 助手:

      <%= hidden_field_tag('authenticity_token', form_authenticity_token.to_s)%>
    

    【讨论】:

      【解决方案2】:

      您似乎缺少 Rails 为避免跨站点伪造而生成的 Authenticity Token。检查生成的 HTML 代码以确保生成了令牌,如果没有生成,那就是问题所在,因为当令牌丢失或不匹配时,Rails 3 的默认行为是重置会话。

      编辑:嗯,问题在于您没有使用 Rails 助手。您在那里只使用普通的 HAML。

      【讨论】:

      • 在我的应用程序布局中,我有这个:= csrf_meta_tags。这似乎只在我发出 POST 请求时发生
      【解决方案3】:

      显然我必须添加这个:

      %input{:type=>"hidden", :name=>"authenticity_token", :value=>form_authenticity_token.to_s}
      

      到我的 HAML 表单,现在一切正常,不再有 WARNING: Can't verify CSRF token authenticity :)

      【讨论】:

      • 嗯,问题是你没有使用 Rails 助手。您在那里只使用普通的 HAML。
      • 如果您使用 rails 助手,则会自动生成真实性令牌。
      • 这是否意味着任何拥有 html 的人现在都可以看到您的身份验证令牌?因此以您的身份登录?这不是一个巨大的安全风险吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多