Я внедряю защиту от CSRF, и мне было очень тяжело. Поэтому я генерирую токен и сохраняю его в $_SESSION['token']
, Теперь мне понадобится этот токен для сравнения на другой странице, поэтому на другой странице я делаю это:
session_start();
$token = "";
$token = $_SESSION['token'];
echo $token;
unset($_SESSION['token']);
echo "<br />";
$compToken = "";
$compToken = $_POST['token'];
echo $compToken;
PHP требует от меня установки переменных на что-либо, иначе это недопустимо. Вот вывод к этому:
41852450b2fbeed352d895d8ee57dfc9
41852450b2fbeed352d895d8ee57dfc9
Как видите, они соответствуют токенам. Теперь, когда я перехожу к оператору if, чтобы сравнить то, что я только что получил из формы, прежде чем приступить к обработке:
if($compToken === $token) {
return true;
} else {
echo "Token error.";
return false;
}
Это просто не работает, об ошибках также не сообщается. Я даже пытался if($_SESSION['token'] === $_POST['token'])
, который должен работать, поскольку обе переменные были успешно переданы и сохранены (как показано в предыдущем коде).
Что происходит с if statement
?
РЕДАКТИРОВАТЬ:
session_start();
$token = md5(uniqid(mt_rand(), true));
$_SESSION["token"] = $token;
Хорошо, часть ниже — беспорядок — для целей отладки. Сожалею!
session_start();
$token = "";
$token = $_SESSION['token'];
$token = trim($token);
echo $token;
unset($_SESSION['token']);
echo "<br />";
$compToken = "";
$compToken = $_POST['token'];
$compToken = trim($compToken);
echo $compToken;
echo "<br />";
echo"1";
if($compToken == $token) {
return true;
} else {
echo "Token error.";
return false;
}
echo "2";
EDIT2:
Для тех, кто читает это в будущем, похоже, что проблема возвращалась к истине для оператора if в оригинале edit
, Я не уверен почему — но меняю это просто echo "true";
похоже на работу. Я собираюсь настроить if statement
только return false; and die();
если они не равны друг другу.
Я только что попробовал, ты удостоверился, что у тебя есть это в твоей форме:
<input type="hidden" name="token" value="<?=$_SESSION['token'];?>" />
Вот мой код:
form.php
<?php
session_start();
$_SESSION['token'] = 'abc123abc123';
?>
<form action="index.php" method="post">
<input type="hidden" name="token" value="abc123abc123" />
<input type="submit" value="Submit">
</form>
Здесь форма отправляет сообщения:
index.php
<?php
session_start();
$token = $_SESSION['token'];
$compToken = $_POST['token'];
if($compToken === $token) {
echo 'True';
} else {
echo "Token error.";
}
И это повторяет «Правда».
Других решений пока нет …