PHP的===操作符似乎是区分大小写的。那么有理由使用strcmp()吗?
===
strcmp()
做下面这样的事情安全吗?
if ($password === $password2) { ... }
如果你希望排序/比较字符串字母顺序,可以使用strcmp()。如果你只是想检查是否相等,那么==就可以了。
==
使用它的原因是因为strcmp
strcmp
返回& lt;如果str1小于str2则为0;>如果str1大于str2则为0,如果相等则为0。
===只返回true或false,它不会告诉你哪个字符串更大。
true
false
使用==可能是危险的。
注意,如果这两种数据类型不同,它会将变量强制转换为另一种数据类型。
例子:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
正如你所看到的,这两个是不同类型的,但结果是true,这可能不是你的代码所期望的。
然而,建议使用===,因为测试表明它比strcmp()和它的不区分大小写的替代方法strcasecmp()快一些。
strcasecmp()
快速谷歌一下这个速度比较:http://snipplr.com/view/758/
永远不要使用==进行字符串比较。===是OK的。
$something = 0; echo ('password123' == $something) ? 'true' : 'false';
只要运行上面的代码,你就会明白为什么。
$something = 0; echo ('password123' === $something) ? 'true' : 'false';
现在好一点了。
strcmp将根据其运行的环境(Linux/Windows)返回不同的值!
原因是,它有一个错误的错误报告说- Bug #53999strcmp()不总是返回-1,0或1
不要在PHP中使用==。它不会如你所愿。即使是字符串与字符串进行比较,PHP也会隐式地将它们转换为浮点数,并在它们显示为数值时进行数值比较。
例如,'1e3' == '1000'返回true。你应该使用===代替。
'1e3' == '1000'
嗯…根据这个PHP bug报告,你甚至可以得到0 wn。
<?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.'; } ?>
永远记住,在比较字符串时,应该使用===操作符(严格比较)和不 ==操作符(松散比较)。
此外,该函数可以帮助排序。为了更清楚地理解排序。如果string1在string2之前排序,Strcmp()返回小于0;如果string2在string1之前排序,则返回大于0;如果两者相同,则返回0。例如
$first_string = "aabo"; $second_string = "aaao"; echo $n = strcmp($first_string, $second_string);
函数将返回大于0的值,因为aaao在aabo之前排序。
strcmp()和===都是区分大小写的,但是===要快得多。
示例代码:速度测试:strcmp vs ===
总结所有答案:
==是字符串比较的坏主意。 它会给你“惊喜”;结果在很多情况下。
===很好,它会给你最好的性能。
strcmp()当你需要确定哪个字符串是“更大”时,通常用于排序操作。
在PHP中,不是使用字母排序,而是使用字符的美国信息交换标准代码值来进行比较。
小写字母的美国信息交换标准代码值比大写字母高。最好使用标识符= = =来进行这种比较。strcmp ()是一个执行二进制安全字符串比较的函数。它接受两个字符串作为参数并返回<如果str1小于str2则为0;>如果str1大于str2则为0,如果相等则为0。还有一个名为strcasecmp ()的不区分大小写版本,它首先将字符串转换为小写字母,然后进行比较。
if ($password === $password2) { ... }是一个不安全的事情 在这种情况下,它会创建一个计时oracle,允许攻击者从执行时间差中获得实际的密码哈希 使用if (hash_equals($password, $password2)) { ... }代替,因为hash_equals执行“定时攻击安全字符串比较”
if (hash_equals($password, $password2)) { ... }