我的所有网页都包含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 :(得分: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
}
答案 1 :(得分:0)
首先......在第1行“include'dbconnection.php'”之后你有分号丢失。 为什么不这样做呢?
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...*/
}