Form token,header.php停止进程

Form token,header.php停止进程,php,csrf,Php,Csrf,我的所有网页都包括header.php和footer.php。php有普通的东西,比如徽标、菜单和搜索框。我在header.php中有这段代码,用于根据CSRF生成表单提交令牌 <?php include 'dbconnection.php' session_start(); $token = md5(uniqid(rand(), TRUE)); $_SESSION['token'] = $token; $_SESSION['token_time'

我的所有网页都包括header.php和footer.php。php有普通的东西,比如徽标、菜单和搜索框。我在header.php中有这段代码,用于根据CSRF生成表单提交令牌

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

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

生成的令牌与my header.php中的搜索表单一起使用。一旦提交,表单将被定向到search.php进行令牌验证和数据处理。search.php也包括header.php。因此,每次调用search.php时,都会生成一个新的令牌,旧的令牌会取消,从而停止整个搜索过程。当我的header.php中有此代码时,如何验证生成的令牌。

在覆盖之前,您可以使用另一个变量来存储最后一个

<?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();

首先。。。在第1行包含“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...*/

}

除了将代币放入会话中,您还如何处理代币?而且我很难把所有的点都连接起来。某个搜索过程何时/如何/为什么停止?@PeeHaa,我添加了令牌以防止在手动页面刷新时插入重复记录。我的搜索表单将搜索词存储在数据库中。当用户手动刷新页面时,我不希望数据库中出现重复条目。正如我所读到的,令牌有助于降低CSRF攻击。你在这里所做的就是所谓的。CSRF令牌用于防止CSRF攻击,而不是解决您的问题。您的特定问题的解决方案称为。以上你的评论是关于两个完全不同的事情。@ PeeHaa,你也可以考虑通过。是的,在我最后的评论中,我确实指出它有助于减少CSRF攻击。而且我仍然不确定实际问题是什么:谢谢你的建议。让我试试。如果行得通,我接受你的回答。再次感谢,先生。我很犹豫,是否可以使用If-else语句检查令牌是否已设置,如果已设置,则继续使用令牌值如果未设置,则设置它。你觉得怎么样,行得通吗?谢谢你的回复。先生,分号丢失是一个输入错误,令牌生成不是问题。去读这篇文章吧。希望能有所帮助
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...*/

}