Существует два основных подхода.
POST-Redirect-GET
Первый - это шаблон post-redirect-get
, в котором пользователь заполняет форму на signup.php
, которая получает POST
ed до submit.php
, которая при успешном завершении возвращает REDIRECT
на thanks.php
. Браузер видит ответ перенаправления и выдает GET для thanks.php
. Это работает, потому что без перенаправления нажатие на обновление приведет к перезагрузке submit.php
, в результате чего предупреждение о повторной публикации данных и двойной запрос POST
будут повторены. Перенаправление решает эту проблему.
signup.php
-----------
...
<input type="text" name="email">
...
submit.php
----------
...
if ($_POST) {
// process data
header('Location: thanks.php');
}
...
thanks.php
----------
...
Thanks
...
NONCE
Второй подход заключается во вставке ключа nonce
в форму. Этот подход имеет дополнительное преимущество предотвращения атак CSRF. Подход здесь заключается в том, чтобы ввести скрытую направляющую в вашу форму:
<input type="nonce" value="<?= uniqid(); ?>">
Сервер должен отслеживать все проблемы одноразовых ключей (в базе данных или что-то в этом роде), и когда он получает форму, он обрабатывает форму и удаляет одноразовый ключ из базы данных. Если пользователь повторно отправит форму повторно, одноразовый ключ не будет существовать, и сервер сможет обработать это, проигнорировав или выдав предупреждение.