【问题标题】:Rails protect_from_forgery problems and warning with C#/unity3DRails protect_from_forgery 问题和 C#/unity3D 警告
【发布时间】:2014-09-20 09:16:05
【问题描述】:

我刚刚接触到 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 == 'application/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 检查我的登录会话?

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

【问题讨论】:

    标签: unity3d protect-from-forgery


    【解决方案1】:

    你有这么多问题,我不会一一解释,而是给你一些提示。 首先,您可以从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,这会自动发生。

    【讨论】:

    • 感谢您的回复!我实际上已经阅读了 Rails API,但现在我想我明白这些选项告诉protect_from_forgery 做了什么。我更关心在我的 c# 应用程序中实现令牌,你能帮忙提供一些参考链接吗?我在 C# 中的 ROR 和 webform 都很漂亮,我为这么多问题道歉:)
    • 对于你提到的第二部分,我在我的 c# 中尝试过类似下面的内容: Hashtable postHeader = new Hashtable(); postHeader.Add("Content-Type", "application/json"); postHeader.Add("X-CSRF-Token", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); WWW www = new WWW(mainUrl + "login/", System.Text.Encoding.UTF8.GetBytes(json), postHeader);这就是您将令牌添加为标头的意思吗?
    • 我对 C# 不熟悉,但我想你已经明白了。
    • 没关系,我可以要求确认一下,while 行protect_from_forgery 带有: :null_session, if: Proc.new { |c| c.request.format.include? 'application/json' },是不是说,如果请求是json请求,那么它会验证它,如果它没有通过,我们返回一个空会话?
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多