You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击confirm弹窗取消按钮仍执行PHP账户删除SQL查询如何解决?

问题原因

  1. 前端确认逻辑未阻止默认跳转:deleteConfirm 函数仅弹出确认弹窗,没有接收 confirm() 方法的返回值,也没有在用户点击取消时拦截a标签的默认跳转行为,因此无论用户选择确认还是取消,浏览器都会跳转至删除链接,触发后端删除逻辑。
  2. 后端逻辑存在安全漏洞:当前删除逻辑仅校验是否存在delete参数,没有校验要删除的用户ID是否为当前登录用户的ID,恶意用户可通过修改URL中的delete参数删除任意账号。
  3. 代码细节错误:数据库连接变量同时使用了$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:24:00