PHP会话变量无法生存

时间:2017-04-25 19:44:16

标签: php forms session token

非常简单的设置:当页面加载时,会生成随机会话令牌并保存在$ _SESSION [“token”]中。表单在隐藏的输入字段中包含此标记。在此之前没有问题。我将表单提交到同一页面(action =“”),然后我尝试检查$ _SESSION [“token”]是否等于通过POST发送的令牌。变量相应地改变,然后我生成一个新的会话令牌,在页面再次加载之前替换旧的$ _SESSION [“token”]。

问题:$ _SESSION [“token”]在调用页面时再次更改(在我可以比较SESSION和POST令牌之前)因此,两个令牌永远不会匹配。我无法弄清楚为什么会改变。这不是我写的代码行,因为它们也会被执行,在页面加载之前再次替换未知来源的随机令牌。

INDEX:

<?php
session_start();
date_default_timezone_set("Europe/Berlin");

$BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

$form_valid = false;


if (isset($_POST["token"]) && isset($_SESSION["token"])) {
    if ($_POST["token"] == $_SESSION["token"]) {
        $form_valid = true;
    }
}

//Set (new) session token
$token = bin2hex(random_bytes(10));
$_SESSION["token"] = $token;

//Load actual page
include ("/backend/admin.php");
?>

包含页面:

 <?php echo "FORM VALID:"; var_dump($form_valid); ?> 
 <?php if (!isset($_SESSION["admin"]) || !$_SESSION["admin"]) { ?>

    <form id="verify" method="POST" action="">
        <label>Password</label>
        <input type="password" name="access">
        <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>">
        <input type="submit" value="Senden">
    </form>

<?php } else { ?>

    ...

<?php } ?>

任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

您的逻辑存在问题,每次会话令牌更新,无论表单是否提交,

$token = bin2hex(random_bytes(10));
$_SESSION["token"] = $token

试试这个,

 <?php
    session_start();
    date_default_timezone_set("Europe/Berlin");

    $BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

    $form_valid = false;


if(empty($_SESSION["token"] )){
 $_SESSION["token"]= bin2hex(random_bytes(10));
}

    if (isset($_POST["token"]) && isset($_SESSION["token"]))
 {
        if ($_POST["token"] == $_SESSION["token"]) {
            $form_valid = true;
            unset($_SESSION["token"]);
        }
    }





    include ("/backend/admin.php");
    ?>