PHP password_hash传入false/null时行为异常?是否我的理解有误?
关于PHP password_hash()处理false/null返回有效哈希的解释
嘿,这其实不是password_hash()的异常行为,而是PHP的类型转换规则在背后起作用,咱们来拆解清楚:
首先看你提供的代码:
$var = password_hash(false, PASSWORD_DEFAULT, ['cost' => 10]); $var = password_hash(null, PASSWORD_DEFAULT, ['cost' => 10]); var_dump($var);
你觉得应该返回false,但实际得到了有效哈希,核心原因是:password_hash()的第一个参数要求是字符串类型,而PHP是弱类型语言,当你传入非字符串的false或null时,会自动触发隐式类型转换:
false会被转换为空字符串""null同样会被转换为空字符串""
换句话说,你实际上是在对空字符串执行哈希操作,而空字符串是合法的输入,所以函数会正常生成对应的哈希值,而不是返回false。
那什么时候password_hash()才会返回false呢?只有当输入参数不符合要求时才会触发,比如:
- 指定了不支持的哈希算法(比如一个不存在的算法常量)
cost参数设置超出有效范围(PHP规定cost的有效值是4到31之间)
举个测试例子验证一下:
// 对空字符串哈希,返回有效哈希 var_dump(password_hash("", PASSWORD_DEFAULT)); // 传入无效算法,返回false var_dump(password_hash("test", 999));
如果想避免这种“意外”的哈希生成,建议在调用password_hash()之前先做输入校验,确保传入的是有效的非空字符串,比如:
function safePasswordHash($input) { if (!is_string($input) || empty($input)) { return false; } return password_hash($input, PASSWORD_DEFAULT, ['cost' => 10]); }
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

