首页 文章

PHP会话变量无法生存

提问于
浏览
0

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

Problem is :$ _SESSION ["token"]在页面调用时再次更改(在我可以比较SESSION和POST令牌之前)因此,两个令牌永远不会匹配 . 我可以't figure out WHY it changes. It'不是我编写的代码行,因为这些代码也被执行,在页面加载之前再次替换未知来源的随机令牌 .

指数:

<?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

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

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

    Try this,

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

相关问题