Rails使用C#/ unity3D保护_from_forgery问题和警告

时间:2014-07-29 03:36:11

标签: unity3d protect-from-forgery

我只是抓住rails'protein_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' }

我试过从页面登录,看起来还可以;至少我可以登录。但是,我有几个问题要问(我在胜利操作系统上)

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

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

  3. 另外,我在下面有另一个应用程序(用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检查我的登录会话?

    先谢谢大家帮助解决我的问题! :)

1 个答案:

答案 0 :(得分:0)

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

此外,Rails Guides还会提供有关CSRF的更多信息。

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

这些用于生成使用:method。

实现非远程链接的动态表单

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

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