表单标记,header.php停止进程

时间:2014-09-20 19:29:15

标签: php csrf

我的所有网页都包含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。

中存在此代码时验证生成的令牌

2 个答案:

答案 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...*/

}