PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?
做下面这样的事情安全吗?
if ($password === $password2) { ... }
PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?
做下面这样的事情安全吗?
if ($password === $password2) { ... }
当前回答
If ($password === $password2){…}在比较其中一个输入是用户控制的密码或密码散列时,这样做并不安全。 在这种情况下,它会创建一个计时oracle,允许攻击者从执行时间差中获得实际的密码散列。 使用if (hash_equals($password, $password2)){…因为hash_equals执行“定时攻击安全字符串比较”。
其他回答
永远不要使用==进行字符串比较。===是可以的。
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
只要运行上面的代码,你就会明白为什么。
$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
现在好一点了。
如果希望按字典顺序排列/比较字符串,可以使用strcmp()。如果你只是想检查是否相等,那么==就可以了。
Strcmp()和===都是区分大小写的,但是===更快。
示例代码:Speed Test: strcmp vs ===
嗯…根据这份PHP bug报告,你甚至会被骗。
<?php
$pass = isset($_GET['pass']) ? $_GET['pass'] : '';
// Query /?pass[]= will authorize user
//strcmp and strcasecmp both are prone to this hack
if ( strcasecmp( $pass, '123456' ) == 0 ){
echo 'You successfully logged in.';
}
?>
它给了你一个警告,但仍然绕过了比较。 你应该像@postfuturist建议的那样做。
If ($password === $password2){…}在比较其中一个输入是用户控制的密码或密码散列时,这样做并不安全。 在这种情况下,它会创建一个计时oracle,允许攻击者从执行时间差中获得实际的密码散列。 使用if (hash_equals($password, $password2)){…因为hash_equals执行“定时攻击安全字符串比较”。