php - 为什么启动会话会导致我的函数生成的表单值在提交时发生变化?
问题描述
我有一个简单的表单,并使用 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>
解决方案
当您提交表单时,页面会刷新并生成新的令牌。如果您想在页面刷新后使用相同的令牌,则在会话中保存一个令牌值(如果之前未设置)。
function generateRandomToken() {
if(isset($_SESSION['token']) && !empty($_SESSION['token'])
$token = $_SESSION['token'];
else{
$token = md5(uniqid());
$_SESSION['token'] = $token;
}
return $token;
}
成功处理表单后,取消设置会话变量。我希望这将有所帮助。
unset($_SESSION['token']);
推荐阅读
- .net-core - MassTransit 中的通用命令路由
- javascript - 如何在不和谐中进行机器人身份验证?
- angularjs - 控制器与 AngularJS 表单一样
- python-3.x - 不支持在 DynamicMap 中嵌套 DynamicMap
- java - 尝试使用 Spring Security 自定义登录失败
- javascript - 字符串转换为 JSON 数组
- java - 如何将数据从 listview 单选按钮保存到 SQLite?
- c# - 使用 iTextSharp 5.0.2.0 的 pdf 文件中的页码
- ios - 随着 iOS 13 的发布,“使用 Apple 登录”是强制性的吗
- php - fopen 为 php://stdin 返回空内容