首页 > 解决方案 > Ruby on rails CSRF 保护表单

问题描述

我了解 Rails 将 CSRF 令牌添加到使用其自定义函数(如 form_with 等)创建的表单中。但它是否也为通用 HTML 生成 CSRF 令牌(在 Rails 中也称为authenticity_token)

我看到这个问题的答案好坏参半。任何有 Rails 实践经验的人在这里帮助我吗?

标签: ruby-on-railsrubyruby-on-rails-4csrfowasp

解决方案


我想我应该把它变成一个完整的答案。

不,在 Rails 中手动创建一个<form></form>不会自动插入真实性令牌。只有在使用Rails 表单助手时才会插入令牌。这些助手允许您在不指定真实性令牌的情况下指定表单的字段;它会自动将令牌字段放入表单中。例如:

<%= form_for @person do |f| %>
  <%= f.label :first_name %>:
  <%= f.text_field :first_name %><br />

  <%= f.label :last_name %>:
  <%= f.text_field :last_name %><br />

  <%= f.submit %>
<% end %>

生成以下带有隐藏authenticity_token字段的 HTML:

<form action="/people" class="new_person" id="new_person" method="post">
  <input name="authenticity_token" type="hidden" value="NrOp5bsjoLRuK8IW5+dQEYjKGUJDe7TQoZVvq95Wteg=" />
  <label for="person_first_name">First name</label>:
  <input id="person_first_name" name="person[first_name]" type="text" /><br />

  <label for="person_last_name">Last name</label>:
  <input id="person_last_name" name="person[last_name]" type="text" /><br />

  <input name="commit" type="submit" value="Create Person" />
</form>

但是,如果您手动生成 HTML,例如使用HAML

%html
  %head
  %body
    %form

生成的 HTML 如下所示:

<html>
  <head></head>
  <body>
    <form></form>
  </body>
</html>

...没有任何authenticity_token领域。

在您链接到的文章中,它说“在 Rails 中生成的典型表单......”意思是使用 Rails 表单助手生成的。在此上下文中使用的意义上,手动创建的表单不是“生成的”。


推荐阅读