ruby-on-rails - Ruby on rails CSRF 保护表单
问题描述
我了解 Rails 将 CSRF 令牌添加到使用其自定义函数(如 form_with 等)创建的表单中。但它是否也为通用 HTML 生成 CSRF 令牌(在 Rails 中也称为authenticity_token)
我看到这个问题的答案好坏参半。任何有 Rails 实践经验的人在这里帮助我吗?
解决方案
我想我应该把它变成一个完整的答案。
不,在 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 表单助手生成的。在此上下文中使用的意义上,手动创建的表单不是“生成的”。