當CSRF令牌不匹配時,Rails引發InvalidAuthenticityToken
。但是,從閱讀source,我無法弄清楚這是如何發生的。我從acking那棵樹開始:Rails CSRF保護如何工作?
$ ack --ignore-dir=test InvalidAuthenticityToken
actionpack/lib/action_controller/metal/request_forgery_protection.rb
4: class InvalidAuthenticityToken < ActionControllerError #:nodoc:
17: # which will check the token and raise an ActionController::InvalidAuthenticityToken
actionpack/lib/action_dispatch/middleware/show_exceptions.rb
22: 'ActionController::InvalidAuthenticityToken' => :unprocessable_entity
只有兩個命中,忽略註釋。第一個是類定義:
class InvalidAuthenticityToken < ActionControllerError #:nodoc:
end
第二個是將異常轉換爲HTTP狀態代碼。 CSRF保護得到由控制器調用protect_from_forgery
啓用,所以讓我們看看:
def protect_from_forgery(options = {})
self.request_forgery_protection_token ||= :authenticity_token
before_filter :verify_authenticity_token, options
end
它增加了一個過濾器:
def verify_authenticity_token
verified_request? || handle_unverified_request
end
當驗證失敗調用該:
def handle_unverified_request
reset_session
end
那麼InvalidAuthenticityToken
實際上是如何提升的?
謝謝!這就是我運行3.0.3但讀取master的源代碼所得到的結果。對這一變化背後原因的很好解釋 - 甚至比官方博客文章中的更好。 – 2011-02-15 23:45:22