2011-02-22 37 views
6

在用戶登錄並驗證其用戶名並保存在session [:user_name]中後,當使用method =「post」(使用標準html)提交表單時,所有會話數據都將被清除,並且用戶將被路由回登錄頁面。如果方法設置爲get,則不會發生這種情況。爲什麼post方法似乎會清除我的rails會話數據?

發表的作品,當我使用的軌道「的form_tag」產生這些附加線:

<div style="margin: 0pt; padding: 0pt; display: inline;"> 
<input type="hidden" value="✓" name="utf8"> 
<input type="hidden" value="a_bunch_of_gibberish" name="authenticity_token"> 
</div> 

這是怎麼回事?

+1

因爲不同的動作將被執行。你應該顯示你的控制器代碼 – fl00r 2011-02-22 19:30:55

回答

9

你使用的是Rails 3.0.4嗎?這聽起來像可能與CSRF fix有關。

如果您需要特定於您的需求的修復,可以在控制器中覆蓋#handle_unverified_request。請參閱https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/request_forgery_protection.rb

Here's an example這個問題出現在OmniAuth和OpenId中。 (請參閱'CSRF Protection In Rails 3.0.4'一節)

+0

我使用的是3.0.4,在看過「Ruby on Rails中的CSRF保護繞過」文章後,我認爲你是對的:'這個修復有兩個主要的變化,當CSRF保護失敗時的行爲已經改變,現在所有非GET請求都需要令牌。 應用此修補程序失敗後,CSRF請求將不再生成HTTP 500錯誤,而是會話將被重置。 – 2011-02-22 20:02:52

+0

簡單的解釋如何覆蓋僞造處理:http://stackoverflow.com/a/1730421/216717 – 2012-04-26 14:29:56

6

如果您要創建自己的html表單,也可能發生此問題。

如果你要在不知道重定向的原因,這是因爲在你的ApplicationController「protect_from_forgery」

爲了讓您的形式發佈,下面的代碼添加到它(或使用form_tag,下面說明)的:

<form ... > 
... 
<%= hidden_field_tag "authenticity_token", form_authenticity_token %> 
... 
</form> 

了「的form_tag」作品的原因是因爲form_tag爲您生成的隱藏字段=)