Вы можете хранить одноразовый номер в каждой из форм. Самый простой способ сделать это - привязать одноразовый номер к идентификатору сеанса, чтобы эти формы работали только в этом сеансе.
Вы захотите, чтобы злоумышленникам было трудно перехватывать идентификаторы сеансов и создавать свои собственные одноразовые номера. Таким образом, один из способов сделать это - использовать HMAC-SHA256 (или подобное) для хеширования идентификатора сеанса, используя ключ, который вы не предоставляете общественности.
(Очевидно, что если злоумышленник может получить фактический идентификатор сеанса сам, он может уже перехватить сеанс. Так что это не то, о чем я говорю, а скорее способность злоумышленника создать сценарий (который выполняется на жертве). компьютер), который может каким-то образом захватить идентификатор сеанса и использовать его для динамической генерации URL с предварительно заполненным одноразовым номером.)
ETA: достаточно ли вышеуказанного подхода самостоятельно, зависит от того, как долго вы ожидаете, что ваши типичные сеансы будут длиться. Если пользователи обычно используют длительные сеансы продолжительностью более нескольких часов, вам нужно использовать что-то более сложное.
Один из подходов заключается в создании нового одноразового номера для каждой формы, который содержит метку времени, а также hash(timestamp . sessionid)
(где hash
- это некоторый вариант HMAC, как описано выше, для предотвращения подделки, а .
- строка конкатенация). Затем вы проверяете одноразовый номер:
- проверка метки времени, чтобы убедиться, что одноразовый номер достаточно свежий (это зависит от вашей политики, но обычно несколько часов)
- затем, вычисляя хеш на основе метки времени и идентификатора сеанса, и сравнивая с одноразовым номером, чтобы убедиться в подлинности одноразового номера
Если проверка одноразового номера завершится неудачно, вы захотите отобразить новую форму, предварительно заполненную отправкой пользователя (так что, если им понадобится целый день, чтобы написать свое сообщение, они не потеряют всю свою тяжелую работу) , а также свежий одноразовый номер. После этого пользователь может повторно успешно отправить его.