ruby on rails - Rails 4真實性令牌




ruby-on-rails ruby-on-rails-4 (9)

不要關閉csrf保護,最好將以下代碼行添加到表單中

<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %> 

如果您使用form_for或form_tag生成表單,則它會自動在表單中添加上面的代碼行

當我遇到一些真實性令牌問題時,我正在研究一個新的Rails 4應用程序(在Ruby 2.0.0-p0上)。

在編寫響應json的控制器時(使用respond_to類方法),當我嘗試使用curl創建記錄時,我開始獲取Action ActionController::InvalidAuthenticityToken異常的create動作。

我確定我設置了-H "Content-Type: application/json"並使用-d "<my data here>"設置數據,但仍然沒有運氣。

我嘗試使用Rails 3.2編寫相同的控制器(在Ruby 1.9.3上),並且我沒有任何真實性令牌問題。 我搜索了四周,我發現Rails 4中的真實性令牌發生了一些變化。根據我的理解,它們不再自動插入到表單中了? 我想這會以某種方式影響非HTML內容類型。

有沒有什麼辦法可以解決這個問題,而無需請求一個HTML表單,搶走真實性標記,然後用該標記發出另一個請求? 還是我完全錯過了一些完全明顯的東西?

編輯:我剛剛嘗試使用腳手架在新的Rails 4應用程序中創建新記錄而不更改任何內容,而且我遇到了同樣的問題,所以我想這不是我所做的。


你試過了嗎?

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

如果您使用帶有rails的jQuery,請小心在不驗證真實性標記的情況下允許進入方法。

jquery-ujs可以為你管理令牌

您應該已經將它作為jquery-rails gem的一部分,但是您可能需要將它包含在application.js中

//= require jquery_ujs

這就是你所需要的 - 你的ajax調用現在應該可以工作

有關更多信息,請參閱: https://github.com/rails/jquery-ujshttps://github.com/rails/jquery-ujs


authenticity_token: true添加到表單標記


我想我只是想出了它。 我改變了(新)默認值

protect_from_forgery with: :exception

protect_from_forgery with: :null_session

根據ApplicationController的註釋。

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.

您可以通過查看request_forgery_protecton.rb的源代碼,或者更具體地看以下幾行來查看它們的區別:

Rails 3.2中

# This is the method that defines the application behavior when a request is found to be unverified.
# By default, \Rails resets the session when it finds an unverified request.
def handle_unverified_request
  reset_session
end

Rails 4中

def handle_unverified_request
  forgery_protection_strategy.new(self).handle_unverified_request
end

這將調用以下內容

def handle_unverified_request
  raise ActionController::InvalidAuthenticityToken
end

我所有的測試工作都很好。 但由於某種原因,我已將環境變量設置為非測試:

export RAILS_ENV=something_non_test

我忘了取消設置這個變量,因為我開始獲取ActionController::InvalidAuthenticityToken異常。

取消設置$RAILS_ENV ,我的測試重新開始工作。


這些功能是為了安全和偽造保護目的而添加的。
但是,要回答你的問題,這裡有一些輸入。 您可以在控制器名稱後添加這些行。

像這樣,

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

以下是不同版本的導軌的一些行。

Rails 3

skip_before_filter:verify_authenticity_token

Rails 4

skip_before_action:verify_authenticity_token


如果您打算為所有控制器例程禁用此安全功能,則可以在application_controller.rb文件中將protect_from_forgery的值更改:null_session

像這樣,

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end


遇到同樣的問題。 通過添加到我的控制器來修復它:

      skip_before_filter :verify_authenticity_token, if: :json_request?






authenticity-token