首页 > 解决方案 > 为什么启动会话会导致我的函数生成的表单值在提交时发生变化?

问题描述

我有一个简单的表单,并使用 PHP 通过创建和回显哈希来设置其中一个字段的值。我不知道为什么,但是当我提交表单而不调用session_start()我的$_POST变量时,会显示页面首次加载时嵌入在我的 HTML 中的正确哈希值。提交表单时,启动会话会导致哈希值发生变化,几乎就像再次调用哈希函数一样。

这对我来说是有道理的,但这并不总是发生。我没有更改我的代码,并且之前测试过这个功能。

XAMPP用来在本地服务器上测试我的程序,并将回显的哈希与浏览器中的“查看页面源”命令进行比较,查看在单击提交按钮之前生成的哈希。

<?php 

// Toggle this to see different results
// session_start();

function generateRandomToken() {
    return md5(uniqid());
}

if (isset($_POST['token'])) {
    echo $_POST['token'];
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form method="post">
        <input type="hidden" name="token" value="<?php echo generateRandomToken(); ?>">
        <input type="submit" name="submit" value="Submit">
    </form>
</body>
</html>

标签: phphtml

解决方案


当您提交表单时,页面会刷新并生成新的令牌。如果您想在页面刷新后使用相同的令牌,则在会话中保存一个令牌值(如果之前未设置)。

function generateRandomToken() {
    if(isset($_SESSION['token']) && !empty($_SESSION['token'])
      $token = $_SESSION['token'];
    else{  
      $token = md5(uniqid());
      $_SESSION['token'] = $token;
    }
    return $token;
}

成功处理表单后,取消设置会话变量。我希望这将有所帮助。

unset($_SESSION['token']);

推荐阅读