2010-11-06 28 views
6

Rails dường như bỏ qua mã thông báo xác thực cho các yêu cầu AJAX. Ví dụ, tôi cố ý thay đổi lời gọi AJAX của mình để kiểm tra điều này với một mã thông báo không hợp lệ và các yêu cầu dường như đi qua bình thường.Rails 3 Mã xác thực yêu cầu AJAX bị bỏ qua

Ứng dụng có cấu hình mặc định để sử dụng lưu trữ cookie phiên và có lệnh gọi protect_from_forgery trong ApplicationController.

Bất kỳ ý tưởng nào khác mà tôi có thể bị thiếu?

Trả lời

7

EDIT >> Tôi gửi câu trả lời này trong một bài viết trên blog cũng như: http://zadasnotes.blogspot.com/2010/11/rails-3-forgery-csrf-protection-for.html

EDIT 2 >> Điều này đã được thay đổi trong Rails 3.0.4. Xem theo dõi bài ở đây: http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html

Sau khi nghiên cứu nó trong một thời gian, tôi quyết định đào một chút vào tài liệu ray mã để tìm hiểu.

Bắt đầu từ đây: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html#method-i-form_authenticity_token

protect_from_forgery thêm một before_filter trên verify_authenticity_token được hiển thị dưới đây:

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 95 
95:  def verify_authenticity_token 
96:   verified_request? || raise(ActionController::InvalidAuthenticityToken) 
97:  end 

verified_request? được hiển thị ở đây:

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 
104:  def verified_request? 
105:   !protect_against_forgery? || request.forgery_whitelisted? || 
106:   form_authenticity_token == params[request_forgery_protection_token] 
107:  end 

Cuối cùng request.forgery_whitelisted?:

# File actionpack/lib/action_dispatch/http/request.rb, line 126 
126:  def forgery_whitelisted? 
127:  get? || xhr? || content_mime_type.nil? || !content_mime_type.verify_request? 
128:  end 

Thông báo xhr?. xmlHttpRequest nằm trong danh sách trắng và không nằm trong danh sách protect_from_forgery. Vì vậy, nó xuất hiện rằng đây là do thiết kế.

Sau khi nghiên cứu thêm về xmlHttpRequests, có vẻ như có những hạn chế khi chạy chúng trên các tên miền, khiến bạn không cần phải áp dụng kiểm tra csrf trên xhr.

+1

Điều này đã thay đổi kể từ Rails 3.0.4 - bây giờ yêu cầu AJAX cũng cần cung cấp mã thông báo. Xem [cam kết này] (https://github.com/rails/rails/commit/ae19e4141f27f80013c11e8b1da68e5c52c779ea) – jamuraa

+0

@jamuraa Cảm ơn bạn đã chỉ ra. Tôi đã có một bài đăng blog tiếp theo về vấn đề này tại đây: http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html – zzawaideh

+3

không có liên kết nào ở trên cho zadasnotes.blogspot.com công việc.... –

Các vấn đề liên quan