Защита формы от повторной отправки

  • Автор темы Автор темы Forever
  • Дата начала Дата начала

Forever

Новичок
Читал, что обычно для такой защиты используется следующая схема:

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

Но при таком подходе появляется проблема, когда пользователь открывает вторую вкладку на сайте, и форма из первой выдаст ошибку.

Подскажите, что с этим можно сделать?
 
То, что сессия даст ошибку, это не проблема.
Проблема может быть, если ты без головы эту ситуацию отрабатываешь.
 
А как так получается, что пользователь отправляет данные повторно?
При отправке просто блокируй кнопку отправки. Если не ajax, то после обработки надо делать redirect
 
А как так получается
maus-dblclick.jpg
 
При отправке просто блокируй кнопку отправки.
я сидел несколько месяцев на канале с потерей пакетов . Провод был от роутера к антенне вайфая был частично перетер.
Как меня бесили формы с таким поведением. Набираешь - набираешь. сабмит. дизабл. а пакет потерян.
 
ну, в случае проблем ясен пень, что кнопка становится доступной и выводится ошибка.
 
Опишите, пожалуйста, логику работы с этим массивом. Я долгий, уж простите
PHP:
const MAX_CSRF_TOKENS_IN_SESSION = 10;
$session->tokens = [];

generateToken() {
    $token = randomValue();
    $session->tokens->push($token);
    if ($session->tokens->length > MAX_CSRF_TOKENS_IN_SESSION) {
       $session->tokens = $session->tokens->tail(MAX_CSRF_TOKENS_IN_SESSION);
    }
    return $token;
}

validateToken($token) {
     if (!$session->tokens->find($token)) {
         return false;
     }
     $session->tokens->delete($token);
     return true;
}
 
Сверху