csrf — токен формы, header.php останавливает процесс

Вся моя веб-страница включает в себя header.php и footer.php. В header.php есть обычные вещи, такие как логотип, меню и окно поиска. У меня есть этот код в моем header.php для генерации токенов для отправки формы в CSRF.

<?php
include 'dbconnection.php'
session_start();

$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();

Сгенерированный токен используется с формой поиска, которая находится в моем header.php. После отправки форма направляется в search.php как для проверки токена, так и для обработки данных. В search.php также включен header.php. Поэтому каждый раз, когда search.php вызывается, генерируется новый токен, а старый удаляется, что, в свою очередь, останавливает весь процесс поиска. Как проверить токен, сгенерированный, когда этот код присутствует в моем header.php.

0

Решение

Вы могли бы использовать другую переменную для хранения последней перед тем, как перезаписать?

<?php
include 'dbconnection.php'
session_start();

$token = md5(uniqid(rand(), TRUE));
if ( isset( $_SESSION['token'] ) ) $_SESSION['last_token'] = $_SESSION['token'];
if ( isset( $_SESSION['token_time'] ) ) $_SESSION['last_token_time'] = $_SESSION['token_time'];

$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();

А потом позже …

if ( $_REQUEST['my_token'] == $_SESSION['last_token'] ) {
// passed
}
0

Другие решения

Прежде всего … у вас пропущена точка с запятой после «include ‘dbconnection.php'» в строке 1.
Почему бы просто не сделать это таким образом?

include 'dbconnection.php';
session_start();if(!isset($_SESSION['token']) || !isset($_SESSION['token_time'])){
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();
}else{
//... do something different
}

$token_age = time() - $_SESSION['token_time'];
if ($_POST['token'] == $_SESSION['token'] && $token_age <= 300){
/* Valid Token if same and generated not longer than 5 min ago...*/

}
0