似乎PHP的===
运算符区分大小写。那么有使用理由strcmp()
吗?
执行以下操作是否安全?
if ($password === $password2) { ... }
strcmp
区分大小写。在某些语言中,例如VB,字符串比较可能不是,因此将返回不同的结果。但是,在PHP中并非如此。
===
而不是==
因为'0XAB' == '0xab'
true。
似乎PHP的===
运算符区分大小写。那么有使用理由strcmp()
吗?
执行以下操作是否安全?
if ($password === $password2) { ... }
strcmp
区分大小写。在某些语言中,例如VB,字符串比较可能不是,因此将返回不同的结果。但是,在PHP中并非如此。
===
而不是==
因为'0XAB' == '0xab'
true。
Answers:
So is there any reason to use strcmp() ?
,而后未来主义者的回答则没有。哦,见鬼......没有人回答似乎在一次编译使用的strcmp()
,对性能的===
,而可靠性差的==
字符串比较......所以我说雷到列表中。
您永远不要将其==
用于字符串比较。===
还可以
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
只需运行上面的代码,您就会明白为什么。
$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
现在,好一点了。
嗯..根据此php错误报告,您甚至可以获得0wned。
<?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的建议进行操作。
使用==
可能会很危险。
请注意,如果两者不同,它将把变量转换为另一种数据类型。
例子:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
如您所见,这两个来自不同的类型,但是结果是true
,这可能不是您的代码所期望的。
===
但是,建议使用,因为测试表明它比strcmp()
不区分大小写的替代方法要快一些strcasecmp()
。
快速谷歌搜索大喊这个速度比较:http : //snipplr.com/view/758/
"012" == "12"
php),也将两个字符串的类型都更改为整数12 == 12
,然后返回true
。
strcmp()
而且===
都区分大小写,但===
速度要快得多
strcmp将根据其运行的环境(Linux / Windows)返回不同的值!
原因是它有一个错误,因为错误报告说 https://bugs.php.net/bug.php?id=53999
请谨慎处理!谢谢。
strcmp()
如果您希望按字典顺序对字符串进行排序/比较,可以使用。如果您只是想检查是否相等,那就==
很好。
===
。
PHP使用字符的ASCII值进行比较,而不是使用字母排序。小写字母的ASCII值比大写字母高。最好使用标识运算符===进行这种比较。strcmp()是执行二进制安全字符串比较的函数。它使用两个字符串作为参数,如果str1小于str2,则返回<0;否则,返回0。如果str1大于str2,则> 0;如果相等,则> 0。还有一个不区分大小写的版本,称为strcasecmp(),该版本首先将字符串转换为小写字母,然后对其进行比较。
if ($password === $password2) { ... }
比较其中一个输入是用户控制的密码或密码散列时,这样做不是安全的事情。
在这种情况下,它会创建一个时间预言机,允许攻击者从执行时间差中得出实际的密码哈希。
请if (hash_equals($password, $password2)) { ... }
改用,因为hash_equals执行“定时攻击安全字符串比较”。
strcmp
?