2010-07-29 83 views
101

下面是一個錯誤,在我的Rails應用程序引起的一種形式:的ActionController :: InvalidAuthenticityToken

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是存在的。

回答

-9

問題由從2.3.8降級到2.3.5解決。 (以及臭名昭著的「您將被重定向。」的問題)

26

真實性標記是在您的視圖中生成的隨機值,用於證明請求是從網站上的表單提交的,而不是其他地方的表單。這可以防止CSRF攻擊:

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

檢查,檢查客戶端/ IP是誰,它看起來像他們使用你的網站,而無需加載你的看法。

如果您需要進一步調試,這個問題是一個良好的開端:Understanding the Rails Authenticity Token

編輯解釋: 這意味着他們調用的行動來處理您提交表單而沒有呈現在您的網站表單。這可能是惡意的(比如說發佈垃圾評論),或者它可能表明一位客戶試圖直接使用您的Web服務API。您是唯一能夠根據您的產品性質來回答此問題並分析您的請求的人。

+0

謝謝,但我已經知道什麼是真實性標記。 _查看誰是客戶端/ IP,看起來他們正在使用您的網站而不加載您的views._對不起,「沒有加載意見」是什麼意思? – 2010-07-29 16:20:06

+1

我的意思是有人(可能是垃圾郵件發送者)可能會將數據提交到您的表單,而無需通過您的應用程序的用戶界面。例如,可以使用諸如curl之類的命令行程序來執行此操作。 – 2010-07-29 16:32:33

+0

約翰完全正確。這意味着他們正在調用處理表單提交的操作,而無需在您的網站上呈現您的表單。 這可能是惡意的(比如說發佈垃圾評論),或者它可能表明客戶試圖直接使用您的Web服務API。 您是唯一可以根據您的產品性質和分析您的請求來回答問題的人。 – Winfield 2010-07-29 16:35:13

161

我有同樣的問題,但頁面緩存的頁面。頁面被緩存了一個陳舊的真實性標記,並且所有使用方法post/put/delete的操作被識別爲僞造企圖。錯誤(422不可處理實體)已返回給用戶。

解決辦法:
地址:

skip_before_filter :verify_authenticity_token 

或 「sagivo」 在軌道4,5加指出:

skip_before_action :verify_authenticity_token 

在裏面做緩存的網頁。

由於@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

+3

這不太可能,我不知道_caches_page_在發佈之前。但是我會檢查_caches_page_,謝謝。 – 2010-08-30 18:01:33

+7

in rails 4'skip_before_action:verify_authenticity_token' – 2014-02-27 17:48:24

+58

這不是一個漏洞嗎? – quantumpotato 2014-11-24 04:40:37

66

對我來說,下軌道4這個問題的原因是我的主要的應用程序佈局的缺失,

<%= csrf_meta_tags %> 

線。當我重寫我的佈局時,我意外刪除了它。

如果這不在主佈局中,您會在任何想要CSRF令牌的頁面中使用它。

+0

非常好!解決了我的問題 – Jason 2014-11-15 21:27:57

+0

我們也收到此錯誤。但它是中斷的。這可能是原因或不會影響每個請求的錯誤? – 2015-10-01 14:21:52

+0

@ Ryan-NealMes,如果你的模板缺少該行,你會得到錯誤。所以有可能你的一些模板有它,其他的則沒有。 – 2015-10-01 21:02:38

4

我有這個問題與JavaScript調用。我解決了這個問題,只需要jquery_ujs到application.js文件中。

+0

是的,我也有這個問題,我在應用程序js中添加了jquery_ujs。有效。 – Abhi 2017-08-03 05:38:07

16

來不及回答,但我找到了解決方案。

當你定義你自己的html表單時,你會因爲安全原因而錯過應該發送給控制器的認證令牌字符串。但是,當你使用軌道形成輔助函數生成表單你喜歡的東西下面

<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> 

因此,解決問題的辦法是要麼添加authenticity_token場或使用軌道形成的助手而不是刪除,降級或升級的軌道。

0

我有這個問題,原因是我複製並粘貼了一個控制器到我的應用程序。我需要將ApplicationController更改爲ApplicationController::Base

39

導致此錯誤的原因有幾個(涉及Rails 4)。如果使用form_for傭工remote: true option.If不是你可以包括withing形式塊行<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

1.檢查<%= csrf_meta_tags %>出現在頁面佈局

2.檢查真實性令牌正在使用AJAX調用發送。

3.如果正在從緩存頁面發送請求,請使用fragment caching排除發送請求的部分頁面,例如button_to等,否則令牌將陳舊/無效。

我就不願廢除CSRF保護...

1

如果你已經做了rake rails:update或以其他方式最近改變了你的config/initializers/session_store.rb,這可能是舊的餅乾的症狀在瀏覽器中。希望這是在開發/測試(這是爲我)完成的,你可以清除所有瀏覽器相關的cookies的問題。

如果這是在生產中,並且您更改了key,請考慮將其更改回使用舊的Cookie(< - 只是猜測)。

0

安裝

gem 'remotipart' 

可以幫助

+1

雖然這可能是答案,但它也有助於包括答案的重要部分,並解釋爲什麼/如何工作。 – Roylee 2015-11-16 02:52:32

0

我們有同樣的問題,但發現它是隻使用HTTP請求://,而不是以https://。原因是secure: true爲session_store:

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

固定使用HTTPS〜處處:)

0

我對本地主機同樣的問題。我已經更改了應用程序的域名,但是在URL和主機文件中仍然存在舊域名。更新我的瀏覽器書籤和主機文件以使用新域,現在一切正常。

14

只需在表格中添加authenticity_token即可。

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 
+1

Rails應該默認發送令牌。我們不想明確指定它。在這種情況下,我感覺令牌有所改變。 – Abhi 2017-08-03 05:06:09

1

也許您已將您的NGINX設置爲HTTPS,但您的證書無效? 我以前有類似的問題,並從http重定向到https解決了問題

0

我已經使用過這樣的東西,它適用於我。

class WelcomeController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :authenticate_model! 
end 
相關問題