代码之家  ›  专栏  ›  技术社区  ›  Nikita Rybak

操作控制器::InvalidAuthenticyToken

  •  119
  • Nikita Rybak  · 技术社区  · 15 年前

    Processing UsersController#update (for **ip** at 2010-07-29 10:52:27) [PUT]
      Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"ysiDvO5s7qhJQrnlSR2+f8jF1gxdB7T9I2ydxpRlSSk=", **more parameters**}
    
    ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
    

    这种情况发生在每一个非- get 如你所见, authenticity_token 有。

    19 回复  |  直到 9 年前
        1
  •  220
  •   Szymon Jeż    5 年前

    我有同样的问题,但与页面缓存页面。页面使用过时的真实性令牌进行缓冲,所有操作都使用post/put/delete方法,其中被识别为伪造尝试。错误(422个不可处理的实体)已返回给用户。

    Rails 3的解决方案:
    添加:

     skip_before_filter :verify_authenticity_token  
    

    或者如rails4中的“sagivo”所指出的:

     skip_before_action :verify_authenticity_token
    

    在进行缓存的页面上。

    :index :show 动作,但要小心使用这个 :put , :post 行动。

    例如:

     caches_page :index, :show  
     skip_before_filter :verify_authenticity_token, :only => [:index, :show]
    

    参考文献: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

    barlop添加的注释-rails4.2不推荐使用skip\u before\u filter,而支持skip\u before\u action https://guides.rubyonrails.org/4_2_release_notes.html

    为了 (正如“collimarco”所指出的)你可以使用 skip_forgery_protection

        2
  •  81
  •   James McMahon    11 年前

    对我来说,Rails 4下的这个问题的原因是,

    <%= csrf_meta_tags %>
    

    我的主应用程序布局中的行。我重写版面时不小心把它删掉了。

        3
  •  66
  •   GoodViber    10 年前

    这个错误有几个原因(与Rails 4有关)。

    <%= csrf_meta_tags %> 在页面布局中显示

    2如果使用,请检查AJAX调用发送的令牌的真实性 form_for 具有的助手 remote: true 选项。如果不是,您可以包括行 <%= hidden_field_tag :authenticity_token, form_authenticity_token %>

    三。如果请求是从缓存页发送的,请使用 fragment caching 排除发送请求的页面部分,例如。 button_to

    我不愿意取消csrf保护。。。

        4
  •  41
  •   Deepak Mahakale    8 年前

    authenticity_token 在形式上为我固定了它。

    <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    
        5
  •  37
  •   vmarquet njlaboratory    5 年前

    ActionController::InvalidAuthenticityToken 也可能由配置错误的反向代理引起。如果在堆栈跟踪中,得到一行 Request origin does not match request base_url

    当使用反向代理(如nginx)作为HTTPS请求的接收器并将请求未加密地传输到后端(如Rails应用程序)时,后端(更具体地说:Rack)期望一些头包含关于原始客户端请求的更多信息,以便能够应用各种处理任务和安全措施。

    更多详情请参见: https://github.com/rails/rails/issues/22965 .

    热释光;DR:解决方案是添加一些标题:

    upstream myapp {
      server              unix:///path/to/puma.sock;
    }
    
    location / {
      proxy_pass        http://myapp;
      proxy_set_header  Host $host;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto $scheme;
      proxy_set_header  X-Forwarded-Ssl on; # Optional
      proxy_set_header  X-Forwarded-Port $server_port;
      proxy_set_header  X-Forwarded-Host $host;
    }
    
        6
  •  30
  •   Community CDub    8 年前

    http://en.wikipedia.org/wiki/Cross-site_request_forgery

    检查客户机/IP是谁,看起来他们正在使用您的站点而没有加载您的视图。

    如果需要进一步调试,可以从以下问题开始: Understanding the Rails Authenticity Token

    编辑解释: 这意味着他们正在调用操作来处理您的表单提交,而从未在您的网站上呈现过您的表单。这可能是恶意的(比如发布垃圾邮件评论),也可能表示客户试图直接使用您的web服务API。你是唯一一个可以通过产品的性质和分析你的需求来回答这个问题的人。

        7
  •  19
  •   pegasuspect    10 年前

    当您定义自己的html表单时,由于安全原因,您错过了应该发送给控制器的身份验证令牌字符串。但是,当您使用rails form helper生成表单时,您会得到如下结果

    <form accept-charset="UTF-8" action="/login/signin" method="post">
      <div style="display:none">
        <input name="utf8" type="hidden" value="&#x2713;">
        <input name="authenticity_token" type="hidden" 
          value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
        .
        .
        .
      </div>
    </form>
    

    因此,问题的解决方案是要么添加令牌字段,要么使用rails表单助手,而不是删除、降级或升级rails。

        8
  •  9
  •   kross    10 年前

    rake rails:update 或者最近改变了你的生活 config/initializers/session_store.rb ,这可能是浏览器中旧cookie的症状。希望这是在dev/test中完成的(这是为我准备的),并且您可以清除与所讨论的域相关的所有浏览器cookie。

    如果这是在生产,你改变了 key

        9
  •  7
  •   Michael Koper    11 年前

    我对javascript调用有这个问题。我修复了这个问题,只需要将jquery\u ujs放入application.js文件。

        10
  •  4
  •   Darep    8 年前

    我们也有同样的问题,但注意到它只适用于使用http://的请求,而不适用于https://. 原因是 secure: true 对于会话存储:

    Rails.application.config.session_store(
      :cookie_store,
      key: '_foo_session',
      domain: '.example.com',
      secure: true
    )
    

    通过使用HTTPS~随处可见来修复:)

        11
  •  2
  •   Carlos Castillo Maicon Douglas    6 年前

    //= require rails-ujs 
    

    在里面

    \app\assets\javascripts\application.js
    
        12
  •  1
  •   aadeshere1 Tal Lev-Ami    7 年前

    对于Rails5,最好添加 protect_from_forgery prepend: true 而不是跳过 verify_authentication_token

        13
  •  0
  •   user2954587    10 年前

    ApplicationController ApplicationController::Base

        14
  •  0
  •   MoD    8 年前

    我在localhost上也遇到了同样的问题。我已经更改了应用程序的域,但在url和hosts文件中仍然存在旧域。更新了我的浏览器书签和主机文件,以使用新的域,现在一切正常。

        15
  •  0
  •   montrealmike    8 年前

    也许你有你的NGINX设置为HTTPS,但你的证书是无效的? 我以前也遇到过类似的问题,从http重定向到https解决了这个问题

        16
  •  0
  •   Praveen KJ    7 年前

    我已检查<%=csrf\u meta\u tags%>现在和清除浏览器中的cookies为我工作。

        17
  •  0
  •   Maxence    7 年前

    根据Chrome Lighthouse对更快应用程序加载的建议,我已经异步了我的Javascript:

    views/layout/application.html.erb

    <%= javascript_include_tag 'application', 'data-turbolinks-track' => 'reload', async: true %>
    

    这打破了一切,并得到了我的远程窗体令牌错误。正在删除 async: true 修复了问题。

        18
  •  0
  •   user2490003    6 年前

    这个答案对rubyonrails更为具体,但希望它能帮助某些人。

    您需要在每个非GET请求中包含CSRF令牌。如果您习惯于使用JQuery,那么Rails有一个名为 jquery-ujs ajax 请求。 See here .

    如果你像我一样离开它,你可能会发现自己有一个错误。您可以手动提交令牌,或者使用另一个库来帮助从DOM中刮取令牌。看到了吗 this post

        19
  •  0
  •   Twistedben    5 年前

    我找到的唯一解决方案是在/tmp文件夹中添加一个txt文件。

    在应用程序的根目录中,运行:

    touch tmp/caching-dev.txt
    

        20
  •  0
  •   Sky    5 年前

    跑步 rails dev:cache 在我的控制台里为我修好了这个(轨道6)

    我认为这可能与Turbolinks有关,但CSRF似乎只有在本地缓存被禁用时才起作用 启用 .

        21
  •  0
  •   stevec Zxeenu    5 年前

    在对我的应用程序的注册过程进行手动测试(与多个用户注册/登录)时,我遇到了这种情况。

    这是一个 许多的

        22
  •  0
  •   Jellicle    5 年前

    当我从rails4.0升级到4.2时,这种情况就发生了。

    4.2实施 verified_request? request.headers['X-CSRF-Token'] ,而我的4.0应用程序得到的标题是 X-XSRF-TOKEN . 我的ApplicationController中的一个快速修复方法是添加以下函数:

      def verify_authenticity_token
        request.headers['X-CSRF-Token'] ||= request.headers['X-XSRF-TOKEN']
        super
      end
    
        23
  •  -1
  •   giapnh    6 年前

    在Rails5中,我们需要添加两行代码

        skip_before_action :verify_authenticity_token
        protect_from_forgery prepend: true, with: :exception
    
        24
  •  -2
  •   Aamir    9 年前

    安装

    gem 'remotipart' 
    

    能帮上忙吗

        25
  •  -17
  •   Bill the Lizard    11 年前

    通过从2.3.8降级到2.3.5来解决问题(以及臭名昭著的“你被重定向了”问题)