Thank you for submitting
никогда не будет отображаться, потому что условие для if( isset($_SESSION['token']) )
всегда выполняется, потому что вы генерируете токен и устанавливаете переменную сеанса непосредственно над этим условием if ... Именно поэтому вы всегда увидите «don» отправить дважды "после отправки в первый раз.
При загрузке формы вы генерируете токен, сохраняете его в сеансе, помещаете в форму.
После отправки формы вы снова запускаете скрипт сверху:
Ваш токен теперь находится в переменной post. Но вы воссоздаете свой жетон сеанса. тогда вы сравниваете пост и сессию. конечно, они не совпадают, потому что вы только что сгенерировали НОВЫЙ токен, поэтому, конечно, они не равны.
Я рекомендую эту структуру для вашего кода:
<html>
<body>
<?php
session_start();
//HAS THE FORM BEEN SUBMITTED?
if(isset($_POST))
{
//THE FORM HAS BEEN SUBMITTED
//VALIDATE THE TOKEN
if($_POST['token'] == $_SESSION['token'])
{
//THE TOKEN WAS VALID, CONTINUE WITH PROCEDURES
}
else
{
echo 'Invalid token, please try again!';
}
}
else
{
//FORM NOT SUBMITTED YET
$token = $_SESSION['token'] = md5( session_id() . time(). rand() );
//i recommend adding rand() otherwise there is always a 1 second window in which the token could be doubled up...
echo '<form action="'. $_SERVER['PHP_SELF'] .'" method="post">';
echo '<input type="hidden" name="token" value="'. $token .'" />';
echo '<input type="text" name="bar" />';
echo '<input type="submit" value="Save" />';
echo '</form>';
}
?>
</body>
</html>