点击confirm弹窗取消按钮仍执行PHP账户删除SQL查询如何解决?
问题原因
- 前端确认逻辑未阻止默认跳转:
deleteConfirm函数仅弹出确认弹窗,没有接收confirm()方法的返回值,也没有在用户点击取消时拦截a标签的默认跳转行为,因此无论用户选择确认还是取消,浏览器都会跳转至删除链接,触发后端删除逻辑。 - 后端逻辑存在安全漏洞:当前删除逻辑仅校验是否存在
delete参数,没有校验要删除的用户ID是否为当前登录用户的ID,恶意用户可通过修改URL中的delete参数删除任意账号。 - 代码细节错误:数据库连接变量同时使用了
$con和$conexion,变量不统一会导致数据库操作报错。
修复方案
1. 调整前端确认逻辑
两种修改方式二选一即可:
- 方式一:修改
deleteConfirm函数返回确认结果,同时在点击事件中增加return标识
<!-- 修改a标签的onclick属性 --> <a class="active-btn del-btn" onClick="return deleteConfirm()" href="profile.php?delete=<?php echo $id; ?>">delete account</a> <!-- 修改JS函数 --> <script> function deleteConfirm() { return confirm('Are you sure you want to delete your account?'); } </script>
- 方式二:省去单独封装函数,直接在点击事件内写确认逻辑
<a class="active-btn del-btn" onClick="return confirm('Are you sure you want to delete your account?')" href="profile.php?delete=<?php echo $id; ?>">delete account</a>
当用户点击取消时,逻辑会返回false,直接阻止a标签的默认跳转行为,不会发送删除请求。
2. 补全后端安全校验
在删除逻辑前增加登录状态校验和账号归属校验,同时统一数据库连接变量:
if(isset($_GET['delete'])) { // 先校验登录状态 if (!isset($_SESSION['id_user'])) { die('请先登录后操作'); } $id_delete = $_GET['delete']; // 校验要删除的账号是否为当前登录用户的账号 if ($id_delete != $_SESSION['id_user']) { die('无权操作他人账号'); } // 原有删除逻辑,统一使用$con作为数据库连接变量 $query = "DELETE FROM users WHERE id_user = ? "; $stmt = mysqli_stmt_init($con); $prepare = mysqli_stmt_prepare($stmt, $query); if(!$prepare) { die('Query failed' . mysqli_error($con)); } else { mysqli_stmt_bind_param($stmt, "i", $id_delete); mysqli_stmt_execute($stmt); logout(); } }
内容的提问来源于stack exchange,提问作者Miguel David
相关产品推荐
相关产品推荐

