2011-02-22 51 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为您生成的隐藏字段=)