如何避免用户回退PHP表单页面篡改前一位人员的出入登记数据
使用cookie机制可以解决该问题,但不能仅依赖cookie过期逻辑,需要搭配页面缓存禁用规则和一次性校验令牌共同实现。你之前尝试失败的核心原因是浏览器点击返回时默认加载本地缓存页面,不会向服务器发起请求,因此服务器侧的cookie校验逻辑根本不会被触发。
具体实现方案
1. 禁用离场表单页面的浏览器缓存
首先在所有展示离场登记表单的PHP页面顶部添加如下响应头,强制浏览器每次访问该页面都必须向服务器发起请求,不得使用本地缓存:
<?php header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Pragma: no-cache"); header("Expires: Thu, 01 Jan 1970 00:00:00 GMT"); ?>配置完成后,用户点击浏览器返回按钮时,会重新请求服务器加载离场表单页面,不会直接展示之前缓存的旧页面。
2. 实现Cookie一次性令牌校验逻辑
给每一条待离场的到访记录绑定唯一的一次性校验令牌,令牌同时存储在用户cookie和数据库对应记录的字段中,仅当令牌匹配时才允许修改离场时间:
离场表单页加载逻辑
查询到对应用户的到访记录后,生成随机令牌并写入cookie和数据库:
// 查询用户到访记录逻辑略 $checkoutToken = bin2hex(random_bytes(16)); // 令牌写入cookie,30分钟内有效 setcookie("checkout_token", $checkoutToken, time() + 1800, "/"); // 将令牌写入该到访记录的checkout_token字段,SQL逻辑略离场提交校验逻辑
收到离场时间提交请求时,先校验令牌有效性:
// 查询对应到访记录逻辑略 // 令牌不存在或者不匹配直接拦截 if (empty($_COOKIE['checkout_token']) || $_COOKIE['checkout_token'] !== $visitRecord['checkout_token']) { http_response_code(403); exit("无效请求,无法修改离场信息"); } // 校验通过,更新离场时间 // 更新完成后立即清空cookie和数据库存储的令牌 setcookie("checkout_token", "", time() - 3600, "/"); // 清空该到访记录的checkout_token字段,SQL逻辑略 // 跳转首页逻辑略该逻辑下,离场登记完成后令牌已经被销毁,就算用户点击返回按钮重新加载表单,也无法通过令牌校验,不能修改上一位用户的离场信息。
3. 前端补充加固(可选)
在登记完成跳转的首页添加JS代码,清除浏览器历史记录中的表单页面,进一步降低误操作概率:
window.addEventListener('load', () => { if (window.history.replaceState) { window.history.replaceState(null, '', window.location.href); } });
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

