Tôi có cùng một vấn đề nhưng với các trang được lưu vào bộ nhớ cache. Các trang được đệm với mã thông báo xác thực cũ và tất cả các hành động bằng cách sử dụng phương thức post / put / xóa trong trường hợp được công nhận là cố gắng giả mạo. Lỗi (422 Thực thể không thể xử lý) đã được trả lại cho người dùng.
Giải pháp cho Rails 3:
Thêm:
skip_before_filter :verify_authenticity_token
hoặc như "sagivo" đã chỉ ra trong Rails 4 add:
skip_before_action :verify_authenticity_token
Trên các trang làm bộ nhớ đệm.
Như @toobulkeh nhận xét đây không phải là một lỗ hổng trên :index
, :show
những hành động, nhưng hãy cẩn thận sử dụng này trên :put
, :post
các hành động.
Ví dụ:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Tham khảo: http://api.rubyonrails.org/groupes/ActionControll/RequestForgeryProtection/ClassMethods.html
Lưu ý được thêm bởi barlop- Rails 4.2 không dùng nữa Skip_b Before_filter có lợi cho Skip_b Before_action https://guides.rubyonrails.org/4_2_release_notes.html "Họ phương thức * _filter đã bị loại bỏ khỏi tài liệu. gia đình phương pháp "
Đối với Rails 6 (như "collimarco" đã chỉ ra), bạn có thể sử dụng skip_forgery_protection
và an toàn khi sử dụng nó cho API REST không sử dụng dữ liệu phiên.