PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?
做下面这样的事情安全吗?
if ($password === $password2) { ... }
PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?
做下面这样的事情安全吗?
if ($password === $password2) { ... }
当前回答
不要在PHP中使用==。它不会如你所愿。即使是字符串与字符串进行比较,PHP也会隐式地将它们转换为浮点数,并在它们显示为数值时进行数值比较。
例如,'1e3' == '1000'返回true。您应该使用===代替。
其他回答
If ($password === $password2){…}在比较其中一个输入是用户控制的密码或密码散列时,这样做并不安全。 在这种情况下,它会创建一个计时oracle,允许攻击者从执行时间差中获得实际的密码散列。 使用if (hash_equals($password, $password2)){…因为hash_equals执行“定时攻击安全字符串比较”。
嗯…根据这份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建议的那样做。
strcmp将根据其运行的环境(Linux/Windows)返回不同的值!
原因是它有一个错误,正如错误报告所说- bug #53999strcmp()并不总是返回-1、0或1
在PHP中,不使用字母排序,而是使用字符的ASCII值进行比较。
小写字母的ASCII值比大写字母高。最好使用恒等运算符===来进行这种比较。Strcmp()是一个执行二进制安全字符串比较的函数。它接受两个字符串作为参数,如果str1小于str2则返回< 0;>如果str1大于str2则为0,如果相等则为0。还有一个不区分大小写的版本,名为strcasecmp(),它首先将字符串转换为小写字母,然后进行比较。
使用它的原因是strcmp
如果str1小于str2则返回< 0;>如果str1大于str2则为0,如果相等则为0。
===只返回true或false,它不会告诉你哪个字符串更大。