防止用户重复提交表单是一个比较常见的问题。下面,我提供一份针对 PHP 的防重复提交表单的攻略。
一、使用 Token 防止 CSRF 攻击
在 Web 应用中,CSRF(跨站点请求伪造)攻击是一个常见威胁。一般情况下,CSRF 攻击需要重复提交表单才能达到目的。因此,防重复提交表单也可以帮助防止 CSRF 攻击。
其中一个防止 CSRF 攻击的技术是利用 Token。在提交表单时,服务器会生成一个 Token,将该 Token 存储到 Session 中,并将该 Token 作为表单字段的值放入请求中。当请求到达服务器时,服务器会检查请求中的 Token 是否与 Session 中存储的 Token 一致,如果一致则说明是合法请求,否则则可能是 CSRF 攻击,应该拒绝请求。
以下是示例代码:
session_start();
// 生成 Token 并保存到 Session 中
if (!isset($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
// 向表单中添加 Token 字段
function add_token_to_form() {
echo '<input type="hidden" name="token" value="' . $_SESSION['token'] . '">';
}
// 验证 Token
function validate_token() {
if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
die('Invalid Token!');
}
}
在表单中调用 add_token_to_form()
函数可以在表单中添加 Token 字段。在处理请求的代码中调用 validate_token()
函数可以验证 Token 是否合法。如果 Token 不合法,则会输出错误信息并退出程序。
二、使用重定向避免重复提交
另外一种常见的防重复提交表单的技术是使用重定向。在提交表单时,服务器会将数据存储到数据库或 Session 中,然后重定向页面。这样,即使用户再次刷新页面或者返回到上一个页面再次提交表单,服务器也不会重复处理表单数据。
以下是一个示例代码:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 处理表单数据
$data = $_POST['data'];
if (!isset($_SESSION['submitted_data'])) {
// 第一次提交,将数据存储到 Session 中并跳转到下一页
$_SESSION['submitted_data'] = $data;
header('Location: /next-page.php');
exit;
} else if ($_SESSION['submitted_data'] === $data) {
// 重复提交,直接返回成功页面
header('Location: /success-page.php');
exit;
} else {
// 数据不一致,可能是 CSRF 攻击,输出错误信息并退出
die('Invalid Data!');
}
}
这个示例代码利用了 Session 存储数据的特性来判断是否重复提交表单。如果是第一次提交,则将数据存储到 Session 中并跳转到下一页。如果是重复提交,则直接重定向到成功页面。如果表单的数据不一致,则可能是 CSRF 攻击,应该输出错误信息并退出程序。
总结:以上两种方法均可避免用户重复提交表单,第一种方法使用 Token 防止 CSRF 攻击,第二种方法使用重定向避免重复提交。具体使用哪种方法取决于应用场景。在 CSRF 攻击较为常见的场景下,建议使用第一种方法。在需要防止重复提交且不需要防止 CSRF 攻击的场景下,可以使用第二种方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP如何防止用户重复提交表单 - Python技术站