0

我刚刚接触到 Rails 的protect_from_forgery,我为我的应用程序编写了一个简单的登录信息,如下所示:

客户端

<h1>Login</h1>

<%= form_for :session do |f| %>
  <p>
    <%= f.label :id %><br />
    <%= f.text_field :id %>
  </p>
  <p>
    <%= f.label :pw %><br />
    <%= f.text_field :pw %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

在服务器端,在我的 application_controller.rb 我有

protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

我已经尝试从页面登录,似乎还可以;至少我可以登录。但是,我有几个问题要问(我在 win OS 上)

  1. 我找不到关于protect_from_forgery 选项的任何细节;如果有任何一方能详细解释以下选项,我将不胜感激:null_session, if: Proc.new { |c| c.request.format == '应用程序/json' }

  2. 如何判断我的表单是否正在使用并通过 CSRF 身份验证?我可以从控制台的参数集中看到发送的表单有一个“authenticity_token”,是这个吗?如果是,它是如何生成/定义的?正如我所看到的,每次都是一样的。

另外,我有另一个应用程序(用 Unity3D c# 编写)在下面执行,连接到同一台服务器:

WWWForm form = new WWWForm(); 
form.AddField("id", id); 
form.AddField("pw", pw);   
WWW www = new WWW(mainUrl + "login/", form);

这一次,我的客户端仍然可以登录,但是从控制台我可以看到有如下警告

WARNING: Can't verify CSRF token authenticity   

我已经对此进行了谷歌搜索,但似乎大多数答案是说我应该添加skip_before_filter :verify_authenticity_token,但这只会绕过安全检查,不是吗?但是我需要在这里进行安全检查,所以这对我来说毫无意义......

我该如何解决这个问题并确保使用protect_from_forgery 检查我的登录会话?

提前感谢大家帮助我解决我的问题!:)

4

1 回答 1

0

你有这么多问题,我不会一一解释,而是给你一些提示。protect_from_forgery首先,您可以从Rails API中找到详细说明。

Rails Guides也会提供更多关于 CSRF 的信息。

<head>
  <%= csrf_meta_tags %>
</head>

这些用于生成使用 :method 实现非远程链接的动态表单。

您不需要将这些标签用于常规表单,因为它们会生成自己的隐藏字段。

对于 GET 以外的 AJAX 请求,从元标记中提取“csrf-token”并作为“X-CSRF-Token”HTTP 标头发送。如果您使用带有 jquery-rails 的 jQuery,这会自动发生。

于 2014-07-29T05:15:45.163 回答