2009-09-05 12 views
5

Tôi có một hình thức đơn giản như thế này:Rails hình thức đơn giản cho InvalidAuthenticityToken lỗi

<form name="serachForm" method="post" action="/home/search"> 
    <input type="text" name="searchText" size="15" value=""> 
    <input class="image" name="searchsubmit" value="Busca" src="/images/btn_go_search.gif" align="top" border="0" height="17" type="image" width="29"> 
</form> 

Và một bộ điều khiển với phương pháp này:

def busca 
    puts params[:searchText] 
    end 

Khi tôi làm một nhấp chuột vào nút hình ảnh dưới dạng Tôi nhận được một ActionController :: InvalidAuthenticityToken. đây là toàn bộ StackTrace:

/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/request_forgery_protection.rb:86:in verify_authenticity_token' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:178:in send' /Library/Ruby/Gems /1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:178:in evaluate_method' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:166:in gọi ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters. rb: 225: trong call' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:629:in run_before_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:615:in call_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:610:in perform_action_without_benchmark' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2 /lib/action_controller/rescue.rb:136:in perform_action_without_caching' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/caching/sql_cache.rb:13:in perform_action ' /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in cache' /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/query_cache.rb:8:in bộ nhớ cache ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/caching/sql_cache.rb:12:in perform_action' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:524:in gửi' /Library/Ruby/Gems/1.8/gems/actionpack -2.2.2/lib/action_controller/base.rb: 524: trong process_without_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:606:in process_without_session_management_support ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/session_management.rb:134:in process' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:392:in quy trình ' /Library/Ruby/Gems/1.8/gems/rails-2.2.2 /lib/webrick_server.rb:74:in service' /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/servers/webrick.rb:66 /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in require ' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in new_constants_in' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in require' /Thư viện /Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/server.rb:49

gì đang xảy ra?

Trả lời

7

Theo mặc định, tất cả-GET không hành động đòi hỏi token xác thực được được chuyển cùng với yêu cầu. Rails sử dụng mã thông báo xác thực để tránh các cuộc tấn công CSRF.

Cách dễ nhất để đảm bảo rằng nó luôn luôn đúng chỗ, là sử dụng trình trợ giúp form_tag thay vì viết HTML bằng tay.

<% form_tag "/home/search", :name => "searchForm" do %> 
    fields here 
<% end %> 
+0

Chắc chắn rồi. Tôi đã sửa chữa! :) –

0

protect_from_forgery: chỉ => [: tạo,: cập nhật,: phá hủy] sẽ giúp bạn tiết kiệm một số rắc rối :) (trong lớp điều khiển của bạn)

+0

Nó không hoạt động. Tôi nhận thấy rằng khi tôi xóa "method = post", lỗi sẽ không xuất hiện nữa. –

5

Nếu bạn không sử dụng người giúp đỡ để tạo ra thẻ mẫu của bạn, đây là cách bạn tự tạo ra các lĩnh vực tiềm ẩn với tính xác thực mã thông báo:

<input type="hidden" 
     value="<%= form_authenticity_token() %>" 
     name="authenticity_token"/> 
20

Dọc theo dòng Nat, thêm

<%= token_tag %> 

ngay sau HTML "hình thức" tag việc

+0

Cảm ơn bạn! Điều này sẽ được thêm vào câu trả lời được chấp nhận. – karlingen

+0

<=% token_tag nil%> nên được sử dụng – Kush

1

Sử dụng một helper hình thức như những người khác đã đề nghị ed ở trên sẽ hoạt động.

Vì đây là biểu mẫu tìm kiếm, nên phương pháp này thực sự là 'get'. Nói chung, bạn nên sử dụng 'get' trừ khi một cái gì đó trong cơ sở dữ liệu sẽ thay đổi.

Sử dụng phương thức = 'get' cho biểu mẫu tìm kiếm cũng có nhiều nút đánh dấu/quay lại thân thiện hơn.