ActionController的:: InvalidAuthenticityToken
下面的错误是由我的Rails应用程序中的表单引起的:
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
就在那里。
我有同样的问题,但与页面caching的页面。 页面被caching了一个陈旧的真实性标记和所有使用方法post / put / delete的行为被识别为伪造企图。 错误(422不可处理实体)返回给用户。
解决scheme:
加:
skip_before_filter :verify_authenticity_token
或者像Rails 4中指出的“sagivo”一样添加:
skip_before_action :verify_authenticity_token
在做caching的页面上。
正如@toobulkeh评论说,这不是一个漏洞: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
对我来说,Rails 4下这个问题的原因是缺失的,
<%= csrf_meta_tags %>
在我的主要应用程序布局线。 当我重写我的布局时,我意外删除了它。
如果这不在主布局中,那么您将在需要CSRF标记的任何页面中都需要它。
这个错误有几个原因,(涉及Rails 4)。
1.检查页面布局中的<%= csrf_meta_tags %>
2.如果使用form_for
helper和remote: true
检查真实性标记正在使用AJAX调用发送。如果不是,您可以在表单块中包含<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
。
3.如果请求是从caching页面发送的,使用片段caching来排除发送请求的页面的一部分,例如button_to
等,否则令牌将陈旧/无效。
我将不愿意取消csrf保护…
真实性标记是在您的视图中生成的随机值,用于certificate请求是从网站上的表单提交的,而不是在其他位置提交的。 这防止CSRF攻击:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
检查看看谁是客户端/ IP,看起来他们正在使用您的网站,而无需加载您的意见。
如果您需要进一步debugging,这个问题是一个很好的开始: 理解Rails真实性令牌
编辑解释:这意味着他们正在调用处理表单提交的行为,而不必在您的网站上呈现您的表单。 这可能是恶意的(比如说发布垃圾评论),也可能表明一个客户试图直接使用您的Web服务API。 您是唯一能够根据您的产品性质来回答您的问题并分析您的请求的人。
来不及回答,但我find了解决办法。
当你定义你自己的html表单时,你会错过authentication令牌string,出于安全原因应该发送给控制器。 但是当你使用rails helper来生成一个表单时,你会得到如下的内容
<form accept-charset="UTF-8" action="/login/signin" method="post"> <div style="display:none"> <input name="utf8" type="hidden" value="✓"> <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA="> . . . </div> </form>
所以问题的解决scheme是要么添加authenticity_token字段,要么使用rails helper,而是删除,降级或升级rails。
只需在表单中添加authenticity_token
就可以解决这个问题。
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
我有这个问题与JavaScript调用。 我解决了这个问题,只需要jquery_ujs到application.js文件。
如果你已经做了rake rails:update
或者最近改了你的config/initializers/session_store.rb
,这可能是浏览器中老cookies的一个症状。 希望这是在开发/testing(这是我的),你可以清除所有相关的域名浏览器的问题。
如果这是在生产中,并且您更改了key
,请考虑将其更改回使用旧的Cookie(< – 只是猜测)。
也许你有你的NGINX设置为HTTPS,但你的证书是无效的? 我过去也遇到类似的问题,并且从httpredirect到https解决了这个问题
我有这个问题,原因是我复制并粘贴到我的应用程序的控制器。 我需要将ApplicationController
更改为ApplicationController::Base
安装
gem 'remotipart'
可以帮助
我们遇到了同样的问题,但是注意到只有使用http://而不使用https://的请求。 原因是secure: true
session_store为secure: true
:
Rails.application.config.session_store( :cookie_store, key: '_foo_session', domain: '.example.com', secure: true )
通过使用HTTPS〜无处不在:)
我在本地主机上有同样的问题。 我已经更改了应用程序的域名,但是在URL和主机文件中仍然存在旧域名。 更新我的浏览器书签和主机文件使用新的域名,现在一切工作正常。
我已经使用了这样的东西,它适用于我。
class WelcomeController < ActionController::Base protect_from_forgery with: :exception before_action :authenticate_model! end
从2.3.8降级到2.3.5解决了问题。 (以及臭名昭着的“你正在redirect”问题)