$ _SESSION [''令牌]从不匹配$ _POST ['令牌']

时间:2014-12-19 20:08:28

标签: php forms function session post

我正在建立一个表格并保护它免受CSRF等。

session_start();
mb_internal_encoding('UTF-8');
$_SESSION['token'] = null;

//other code to check and control form

function create_token() {
    $token = md5(uniqid(mt_rand(), true));

    $_SESSION['token'] = $token;

    return $token;
}

$newToken = create_token();

然后在我的表格中我把这个<input name=:"token" type="hidden" value="<?php echo ($newToken);?>">

现在,如果我想通过这样做来验证表单提交:

function user_submit_check() {
    if(!isset($_SESSION['token'])) { 
        return false;
    }

    if(!isset($_POST['token'])) {
        return false;
    }
    //This next 'if' statement always returns false
    if ($_POST['token'] !== $_SESSION['token']) {
        return false;
    }
return true;
}

if (user_submit_token() === true) {
    //process user input
} else {
    die("There is a problem with verification.");
}

问题是user_submit_check()总是返回false,(参见函数中的注释)。到目前为止,我无法找到解决方案的原因。很多消息来源都说这种方法有效。

此外,我还尝试使用$_POST['token'] !== $_SESSION['token']

手动检查echo ("posted input token" . $_POST['token'] . "stored in $_SESSION" . $_SESSION['token']);

这表明两个令牌实际上是相同的,至少在纸面上。 我可能遗漏了一些东西,但我对用PHP保护表单有点新意。

修改 分享可能很有用,我现在在一个页面上做所有安全性和所有html /表单内容。我使用它:<form action="<?php $_SERVER['PHP_SELF'];?>"来执行脚本...(检查空表单字段等等)。

编辑2: 感谢@CBroe,指出了没有&#34;&#34;关于所有属性。

有人知道我做错了吗?

2 个答案:

答案 0 :(得分:0)

检查项目是否已过帐。

<?php

if($_SERVER['REQUEST_METHOD'] === 'POST') 
{    
    if(isset($_POST['token'])) 
    {       
        // Test to see if tokens match
        if($_SESSION['token'] === $_POST['token']) 
        {           
            // process user input
            unset($_SESSION['token']);
        } else {
            die('Tokens did not match');
        }
    } else {
        die('No token found');
    }
} else {

    $_SESSION['token'] = md5(uniqid(mt_rand(), true));

    ?>

<form>
<input name=token type=hidden value="<?php echo $_SESSION['token']; ?>">
</form>

<?php 
}
?>

答案 1 :(得分:0)

您应该在回复之前检查会话是否已设置

<input name="token" type=hidden 
       value=<?php echo (isset($_SESSION['token'])) ? $_SESSION['token'] : ''?>>
对于您要实现的目标,

PHP代码应该非常简单:

session_start();
mb_internal_encoding('UTF-8');
if(isset($_POST['submit'], $_POST['token'], $_SESSION['token'])){

    if ($_POST['token'] === $_SESSION['token']){
        echo 'token match';
    }else{
        echo 'token do not match';
    }

}else{
    $_SESSION['token'] = md5(uniqid(mt_rand(), true));
}