【问题标题】:Why does the post method seem to be clearing my rails session data?为什么 post 方法似乎正在清除我的 rails 会话数据?
【发布时间】:2023-03-11 16:35:02
【问题描述】:

在用户登录并且他们的用户名经过身份验证并保存在 session[:user_name] 中后,当提交带有 method="post" 的表单(使用标准 html)时,所有会话数据都被清除,用户被路由回登录页。如果方法设置为 get,则不会发生这种情况。

当我使用生成这些附加行的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>

发生了什么?

【问题讨论】:

  • 因为执行了不同的动作。你应该显示你的控制器代码

标签: ruby-on-rails ruby-on-rails-3 session


【解决方案1】:

您使用的是 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 有关。 (请参阅“Rails 3.0.4 中的 CSRF 保护”部分)

【讨论】:

  • 我正在使用 3.0.4,在浏览了“Ruby on Rails 中的 CSRF 保护绕过”文章后,我认为您是对的:“此修复有两个主要变化,即 CSRF 保护时的行为失败已更改,现在所有非 GET 请求都需要令牌。应用此补丁后,失败的 CSRF 请求将不再产生 HTTP 500 错误,而是重置会话。'
  • 简单解释如何覆盖伪造处理:stackoverflow.com/a/1730421/216717
【解决方案2】:

如果您正在创建自己的 html 表单,也会发生此问题。

如果您在不知道原因的情况下被重定向,那是因为您的 ApplicationController 中的“protect_from_forgery”

为了让您的表单能够发布,请在其中添加以下代码(或使用form_tag,解释如下):

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

“form_tag”起作用的原因是form_tag 为您生成隐藏字段=)

【讨论】:

  • @Dave 很高兴它做到了! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多