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

Forever

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

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

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

Подскажите, что с этим можно сделать?
 

AnrDaemon

Продвинутый новичок
То, что сессия даст ошибку, это не проблема.
Проблема может быть, если ты без головы эту ситуацию отрабатываешь.
 

AmdY

Пью пиво
Команда форума
А как так получается, что пользователь отправляет данные повторно?
При отправке просто блокируй кнопку отправки. Если не ajax, то после обработки надо делать redirect
 

antson

Новичок
Партнер клуба
При отправке просто блокируй кнопку отправки.
я сидел несколько месяцев на канале с потерей пакетов . Провод был от роутера к антенне вайфая был частично перетер.
Как меня бесили формы с таким поведением. Набираешь - набираешь. сабмит. дизабл. а пакет потерян.
 

AmdY

Пью пиво
Команда форума
ну, в случае проблем ясен пень, что кнопка становится доступной и выводится ошибка.
 

fixxxer

К.О.
Партнер клуба
Опишите, пожалуйста, логику работы с этим массивом. Я долгий, уж простите
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;
}
 
Сверху