[ruby-on-rails-3] rails - “警告:無法驗證json設計請求的CSRF令牌可靠性”


Answers

您可以在成功登錄後使用自定義標題發送CSRF令牌。

例如,把它放在你的會話中#create:

response.headers['X-CSRF-Token'] = form_authenticity_token

提供CSRF令牌的示例登錄響應頭文件:

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Connection: Keep-Alive
Content-Length: 35
Content-Type: application/json; charset=utf-8
Date: Mon, 22 Oct 2012 11:39:04 GMT
Etag: "9d719d3b9aabd413c3603e04e8a3933d"
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12)
Set-Cookie: [cut for readability] 
X-Csrf-Token: PbtMPfrszxH6QfRcWJCCyRo7BlxJUPU7HqC2uz2tKGw=
X-Request-Id: 178746992d7aca928c876818fcdd4c96
X-Runtime: 0.169792
X-Ua-Compatible: IE=Edge

此令牌在您再次登錄或註銷之前有效(如果您通過API支持此功能)。 您的客戶端可以從登錄響應頭中提取並存儲令牌。 然後,每個POST / PUT / DELETE請求必須使用在登錄時收到的值設置X-CSRF-Token標頭。

使用CSRF令牌的POST標頭示例:

POST /api/report HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, compress
Content-Type: application/json; charset=utf-8
Cookie: [cut for readability]
Host: localhost:3000
User-Agent: HTTPie/0.3.0
X-CSRF-Token: PbtMPfrszxH6QfRcWJCCyRo7BlxJUPU7HqC2uz2tKGw=

文檔: form_authenticity_token

Question

我如何檢索CSRF令牌以傳遞JSON請求?

我知道,出於安全原因, Rails正在所有請求類型(包括JSON / XML)上檢查CSRF令牌

我可以放入我的控制器skip_before_filter :verify_authenticity_token ,但我會失去CRSF保護(不建議:-))。

這種類似的(仍未被接受的) answer表明

使用<%= form_authenticity_token %>檢索標記

問題是如何? 我是否需要首先打電話給我的任何頁面來檢索令牌,然後與Devise進行真正的身份驗證? 或者它是我可以從服務器獲得的一次性信息,然後一直使用(直到我在服務器本身手動更改它)?




我對以下版本的Rails有同樣的問題:
gem'rails',:git =>'git://github.com/rails/rails.git',:branch =>'3-2-stable'

我更新到3.2.2,現在一切正常。 :)
寶石'鐵軌','3.2.2'




也用於開發/測試模式。

protect_from_forgery with: :exception unless %w(development test).include? Rails.env

此警告顯示,因為您正在使用:null_session ,在Rails 4.1中,默認情況下,如果沒有with:指定選項,它將起作用。

protect_from_forgery






我已經使用了下面的內容。 使用include? 所以如果內容類型是application / json; charset = utf-8,那麼它仍然在工作。

protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format.include? 'application/json' }



Related