2016-10-02 5 views
0

В моем приложении у меня есть форму для создания Города.может отправить форму много раз с тем же токеном csrf

Все работает нормально, если для опции дистанционного управления на форме установлено значение 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

Запросы поступают из вашего кода, и они __are__ аутентичны. Таким образом, токен выполняет свое обещание. Он не обещает защитить вас от повторных запросов, не так ли? –

+0

@SergioTulentsev, если вы установили пульт в значение false, а затем попробуйте отправить форму во второй раз, вы получите сообщение об ошибке ActionController :: InvalidAuthenticityToken. – Sahand

+0

Как отправить форму во второй раз, если страница перезагружается? –

ответ

0

Могу ли я получить это правильно, что вы хотите, чтобы предотвратить создание city с теми же Params?

Тогда это незначительная ответственность CSRF. CSRF предотвращает запросы с других доменов на ваш сервер, это функция безопасности.

Валидация данных (разрешая только один город с некоторыми определенными параметрами) является ответственностью за валидацию модели. Поэтому вам нужно добавить validates_uniqueness_of :name в вашу модель City. (также вы можете добавить опцию scope: :province_id). См http://guides.rubyonrails.org/active_record_validations.html#uniqueness

С другой стороны, если вы просто хотите, чтобы предотвратить пользователя от случайного двойного щелчка по представить, вы можете добавить disable_with вариант БТН помощника, чтобы отключить его после щелчка (вам необходимо включить его обратно с кодом после ответ)

+0

Нет, это не то, что я имел в виду. Я думаю, вы не сможете представить две формы с одним токеном CSRF, что возможно в этой ситуации, но не возможно, когда форма не отправляется удаленно. – Sahand

+0

Что происходит, когда вы отправляете форму синхронно? – faron

+0

Когда я отправляю форму синхронно, если я попытаюсь отправить форму во второй раз с тем же токеном, я бы получил ошибку InvalidAuthenticityToken – Sahand

Смежные вопросы