Предотвращение дублирования отправки формы

Я придумал метод предотвращения дублирования отправки формы путем перехода назад / вперед или обновления страницы. И я подумал о том, чтобы обсудить это здесь, я уже протестировал образец не в производственной среде, какие недостатки вы можете выявить?

Обратите внимание, что я хорошо знаю об использовании токенов форм, которые защитят вас от атак CSRF, и разве t добавлен на шагах ниже.

-Создайте идентификатор формы для каждой формы и используйте его как скрытое поле в форме:

$formid = microtime(true)*10000;

- При отправке формы :

  • Подтвердить на основе данных

  • Вычислить хеш полей формы данные

     $ allval = '';
    foreach ($ _ POST as $ k => $ v) {
     $ allval. = $ v;
    }
    $ formHash = sha1 ($ allval);
    
  • Подтвердить хэш формы путем сравнения с ранее сохраненными хэшами. значение сеанса привязано к каждой форме переменной $ formid.

     $ allowAction = true;
    if (isset ($ _ SESSION ['formHash'] [$ _ POST ['formid']]) && ($ _SESSION ['formHash'] [$ _ POST ['formid']] == $ formHash)) {
     $ allowAction = false;
    }
    
  • Если хеш формы не найден, это означает, что форма отправляется впервые или данные формы изменены.
  • Если данные сохранены (например, в базе данных), сохранить хэш формы в сеансе:

     $ _ SESSION ['formHash'] [$ _ POST ['formid']] = $ formHash;
    

Полная версия кода: http://thebusy.me/2011/01/06/preventing-duplicate-form-submissions/

12
задан isogashii 6 January 2011 в 14:15
поделиться