Я тестировал некоторые формы, которые я собирал, и недавно реализовал сравнение токенов для дополнительной безопасности. Вот код для сравнения токенов:
На самой форме:
session_start();
$token = md5(uniqid(mt_rand(), true));
$_SESSION["token"] = $token;
session_write_close();
Затем на форме обработки:
session_start();
$token = "";
$token = $_SESSION['token'];
unset($_SESSION['token']);
session_write_close();
if(empty($token)) {
echo htmlspecialchars('An error has occurred. Please resubmit.');
// header( "refresh:3; url=website" );
die();
}
if($_POST['token'] != $token) {
echo htmlspecialchars('An error has occurred. Please resubmit.');
// header( "refresh:3; url=website" );
die();
}
Токен хранится в виде:
<input type="hidden" name="token" value="<?php echo $token;?>"/>
В первый раз, когда я заполняю форму и отправляю ее, я всегда получаю ошибку токена. Однако после некоторого тестирования я понял, что проблема возникает только при первом запуске сервера (WAMP). После первой первоначальной отправки все работает нормально. Вот несколько сравнений тестов, которые я сделал:
Таким образом, главная проблема заключается в следующем: при перезапуске сервера сравнение токенов кажется неудачным. После первой первоначальной отправки формы (что является ошибкой) все работает нормально, пока я не выхожу из сервера и не запускаю его снова. Почему это происходит?
Код, который я использую, является модифицированной версией кода, опубликованного @leeppowers в этой теме: нить
Задача ещё не решена.
Других решений пока нет …