我只是抓住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' }
我试过从页面登录,看起来还可以;至少我可以登录。但是,我有几个问题要问(我在胜利操作系统上)
我找不到有关protect_from_forgery选项的任何细节;我很感激,如果有任何一方我可以得到关于以下选项的详细解释:null_session,if:Proc.new {| c | c.request.format =='application / json'}
如何判断我的表单是否正在使用并通过CSRF身份验证?我可以从控制台中看到一组params中发送的表单有一个'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检查我的登录会话?
先谢谢大家帮助解决我的问题! :)
答案 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,这会自动发生。