Ruby rails 个 CSRF 保护表单

Ruby on rails CSRF protection forms

我知道 rails 将 CSRF 令牌添加到使用其自定义函数创建的表单中,例如 form_with 等。但它是否也会生成 CSRF 令牌(a.k.a authenticity_token在 rails 术语中)一般 HTML

我看到对此的答案不一。任何有 Rails 实践经验的人都可以帮助我吗?

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

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

<%= 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 字段。

在您链接到的 the article 中,它表示 "A typical form generated in Rails..." 表示使用 Rails 表单助手生成。在此上下文中使用的意义上,手动创建的表单不是 "generated"。