php - strcmp vs. == vs. === 在 PHP 中用于检查散列相等性

标签 php string security bcrypt crypt

我正在使用 crypt() 在 PHP 中对密码进行哈希处理,并试图在执行密码检查时找出最安全的方法来测试生成的哈希值是否相等。

我可以看到三个选项:

选项 1 - 双等号

function checkPassword($hash, $password)
{
    return crypt($password, $hash) == $hash;
}

选项 2 - 三重相等

function checkPassword($hash, $password)
{
    return crypt($password, $hash) === $hash;
}

选项 3 - strcmp()

function checkPassword($hash, $password)
{
    return strcmp(crypt($password, $hash), $hash) === 0;
}

我的直觉告诉我选项 1 是个坏主意,因为缺少类型检查,而选项 2 或 3 可能更好。但是,我无法确定是否存在 ===strcmp 会失败的特定情况。哪种方法最安全?

最佳答案

说到安全,我更喜欢使用 ===运算符(operator)。 ===确保两个操作数完全相同,而无需尝试进行一些强制转换以“帮助”比较以达到成功匹配 - 因为它可能有助于开发,这要归功于松散类型的语言,如 PHP。

当然,其中一个操作数是可信的。来自数据库的散列是可信的,而用户输入则不是。

人们总是可以犹豫一会儿,得出使用 == 没有风险的结论。在特定情况下。也许。但是比如

  "0afd9f7b678fdefca" == 0 is true
  "aafd9f7b678fdefca" == 0 is also true

因为 PHP 试图将“散列”转换为数字(可能使用 atoi),结果为 0。虽然不太可能 crypt返回 0,我更愿意通过使用 === 来最大化密码不匹配的情况(并接听支持电话) ,而不是通过使用 == 允许我没有考虑过的罕见情况.

至于strcmp , 函数返回 <0>0如果不同,如果相等则为 0。但是

  strcmp("3", 0003) returns 0
  strcmp("0003", 0003) returns -3

毕竟这并不奇怪。文字 0003实际上是一个整数,3由于 strcmp 需要一个字符串,因此 3将转换为 "3" .但这表明在这种情况下可能会发生一些转换,因为 strcmp 是一个函数,而 ===是语言的一部分。

所以在那种情况下我更喜欢 === (无论如何都比 == 快)。

关于php - strcmp vs. == vs. === 在 PHP 中用于检查散列相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711474/

相关文章:

php - Jaxl 没有使用示例做任何事情。 Facebook 聊天尝试

security - DoS 攻击我的本地主机 tomcat

PHP: fatal error :调用非对象上的成员函数

php - 无法通过ajax从mysql查询读取json元素

c - 从输入中读取具有定义字符数的字符串

python - 按组连接字符串python

c++ - std::string 和 char* 的特化函数模板

security - HttpPostedFile.FileName - 与 IE 不同

javascript - 在javascript中添加到期时间

php - MYSQL区间查询SQL注入(inject)