Warning: password_hash() expects at least 2 parameters, 1 given in /box/script.php on line 2明确指出:password_hash()函数至少需要 2 个参数,但你只传了 1 个。
这是 PHP 中常见的函数调用参数缺失错误,根源在于未严格遵循password_hash()的函数签名。
一、函数签名:password_hash()到底要几个参数?
password_hash(string$password,int$algo,?array$options=null):string|false- 参数 1:
$password(你要哈希的明文密码)✅ 必填 - 参数 2:
$algo(哈希算法,如PASSWORD_DEFAULT)✅ 必填 - 参数 3:
$options(可选配置,如 cost)⭕ 可选
🔑核心规则:前两个参数必须提供,不能省略。
二、错误代码示例(触发警告)
// ❌ 错误:只传了 1 个参数$hash=password_hash($password);// 缺少 $algoPHP 无法知道你想用哪种算法(bcrypt?argon2?),因此报错。
三、正确写法(推荐方式)
✅ 基础用法(最常用):
$hash=password_hash($password,PASSWORD_DEFAULT);PASSWORD_DEFAULT:- 当前 PHP 版本推荐的强哈希算法(PHP 7.4+ =
bcrypt,PHP 8.0+ 未来可能升级为argon2id); - 自动加盐(无需手动处理 salt);
- 自适应 cost(未来可升级)。
- 当前 PHP 版本推荐的强哈希算法(PHP 7.4+ =
✅ 显式指定算法(如需兼容性控制):
// 使用 bcrypt$hash=password_hash($password,PASSWORD_BCRYPT);// 使用 argon2id(PHP 7.2+,需编译支持)$hash=password_hash($password,PASSWORD_ARGON2ID);✅ 自定义选项(如提高安全性):
$hash=password_hash($password,PASSWORD_DEFAULT,['cost'=>12,// bcrypt 迭代次数(默认 10,建议 10-12)]);四、验证哈希:配套使用password_verify()
// 验证密码if(password_verify($inputPassword,$hash)){// 登录成功}else{// 密码错误}⚠️切勿用
==或md5()比较密码!
五、高危误区
🚫 误区 1:“可以只传密码,算法用默认值”
- 真相:PHP 不允许省略第二个参数,即使你想用默认算法;
- 必须显式写
PASSWORD_DEFAULT。
🚫 误区 2:“可以用md5($password)替代”
- 真相:
md5/sha1不是密码哈希函数,可被彩虹表/GPU 秒破;password_hash()是唯一安全选择。
🚫 误区 3:“需要自己生成 salt”
- 真相:
password_hash()自动加盐;- 手动加盐反而降低安全性(可能盐重复或弱)。
六、终极心法:密码哈希是安全底线,不是可选项
不要问“怎么让
password_hash()少传参数”,
而要问“如何正确使用它保护用户”。
- 安全系统:
- 用
password_hash()+password_verify(); - 永远不存储明文密码;
- 用
- 脆弱系统:
- 用
md5、sha1、或参数错误的password_hash(); - 一次泄露 = 所有用户密码暴露。
- 用
真正的用户安全,
不在“功能实现”,
而在“哈希正确”。
七、行动建议:今日密码安全修复
## 2025-06-25 密码安全修复 ### 1. 全局搜索 password_hash - [ ] 确保所有调用有 2 个以上参数 ### 2. 替换不安全哈希 - [ ] md5() / sha1() → password_hash() ### 3. 验证登录逻辑 - [ ] 使用 password_verify(),非 == ### 4. 测试注册/登录 - [ ] 确认密码可正确验证✅完成即构建密码安全基线。
当你停止省略参数,
开始用标准方式哈希密码,
用户账户就从风险,
变为可信赖的堡垒。
这,才是专业 PHP 程序员的安全观。