可以使用相同的csrf令牌多次提交表单

时间:2016-10-02 10:54:17

标签: ruby-on-rails ruby-on-rails-4 form-for csrf-protection

在我的申请表中,我有一张创建城市的表格。

当表单上的远程选项设置为 false 时,一切正常。但是,当我将其更改为 true 时会出现问题。

当远程提交表单时,我可以使用相同的CSRF令牌提交两个表单,而不是为第二个请求获取 ActionController :: InvalidAuthenticityToken 错误。第二个请求也会创建一个不得发生的对象。

您知道导致此问题的原因以及如何解决?

<%= form_for [:administrators,@city],remote: true,:authenticity_token => true do |f| %>
<div class="field">

    <%= f.label :province_id,'Select a province' %>
    <%= f.select :province_id,options_from_collection_for_select(Province.all, :id,:name, @city.province_id),{ :prompt => 'Select province' } %> <br>
    <div class="errors alert-box alert" style="display:none;"></div>
</div>
<div class="field">
    <%= f.label :name %>
    <%= f.text_field :name%> 
    <div class="errors alert-box alert" style="display:none;"></div>
</div>
<div class="action">
    <% if @city.id? %>
        <%= f.submit 'Update', class:'button' %>
        <btn class='cancel_form_button button tiny alert'>  </btn>
    <% else %>
        <%= f.submit 'Create', class:'button' %>
    <% end %>
</div>

1 个答案:

答案 0 :(得分:0)

我是否认为您要阻止使用相同的参数创建this.isNavShow = data['isNavShow'] && data['isNavShow'].toLowerCase() === 'true';

然后它不是CSRF令牌责任。 CSRF阻止来自其他域的请求到您的服务器及其安全功能。

数据验证(仅允许一个具有某些特定参数的城市)是模型验证的责任。因此,您需要将city添加到validates_uniqueness_of :name模型中。 (您也可以添加City选项)。见http://guides.rubyonrails.org/active_record_validations.html#uniqueness

另一方面,如果您只是想阻止用户偶尔双击提交,您可以在btn帮助器中添加scope: :province_id选项以在单击后禁用它(您需要将其启用响应后的代码)