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

PHP实现带密码验证的账号删除功能:切换password_hash后代码适配问题

正确适配password_hash的修改方案

核心错误点

  • password_verify() 函数返回的是布尔值(true/false),不是加密后的哈希串,你把它作为参数传到SQL里和数据库存储的哈希比对,逻辑完全不成立
  • password_hash 生成的哈希默认会随机加盐,每次计算结果都不同,无法直接用WHERE password = xxx的SQL语句做等值查询,必须先取出对应用户的存储哈希再做校验

修正后的完整代码

if(!empty($_POST['delete'])){
    if(empty($_POST['currentpassword'])) {
        $error = error('Please enter current password.');
    }

    // 仅根据用户ID查询对应存储的密码哈希
    $SQLCheckCurrent = $odb -> prepare("SELECT `password` FROM `users` WHERE `ID` = :ID LIMIT 1");
    $SQLCheckCurrent -> execute(array(':ID' => $_SESSION['ID']));
    $storedHash = $SQLCheckCurrent -> fetchColumn();

    // 用password_verify校验提交的明文密码和存储哈希是否匹配
    if (!$storedHash || !password_verify($_POST['currentpassword'], $storedHash)){
        $error = error('Current password is incorrect.');
    }
    
    $notify = error($error);

    if(empty($error)){
        $SQLUpdate = $odb -> prepare("DELETE FROM `users` WHERE `username` = :username AND `ID` = :id");
        $SQLUpdate -> execute(array(':username' => $_SESSION['username'], ':id' => $_SESSION['ID']));
        session_destroy();
        header("location: login");
        die();
    }
}

额外优化提示

如果你当前页面已经提前加载了当前登录用户的完整信息(也就是你代码里提到的$userInfo变量),可以直接用$userInfo['password']做校验,省略查询密码哈希的SQL步骤,减少一次数据库请求。

内容的提问来源于stack exchange,提问作者juliaroje86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:36:01