一篇文章带你搞定PHP强比较和弱比较(附带科学计数法)

在PHP中,比较操作符包括两种类型:强比较和弱比较。

强比较(全等比较符===):强比较要求比较的两个值不仅是值相等,而且类型也必须相等。只有当值和类型都相等时,才会返回 true。例如:
php
$a = 5;
$b = "5";

if ($a === $b) {
  echo "相等";
} else {
  echo "不相等";
}
上述代码中,虽然 $a 和 $b 的值相等,但是类型不同,因此比较结果是不相等。

换句话说就是长的可能不一样,但是经过转化后最终一样

弱比较(相等比较符==):弱比较只要求比较的两个值在转换类型后相等即可。如果两个值的类型不同,会尝试将其中一个值转换为另一个值的类型。例如:
php
$a = 5;
$b = "5";

if ($a == $b) {
  echo "相等";
} else {
  echo "不相等";
}
上述代码中,比较结果不相等,由于 $b 是字符串类型,因此 $a 将被自动转换为字符串类型后再进行比较。

干脆直接点:PHP比较运算符 ===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等。只要两边字符串类型不同会返回false

扩展:

弱比较的绕过大致有以下的几种:

1.小数点绕过:

1=1.0000

2.正负号绕过:

2=+2

3.单双引号绕过:

3==“3”

4.科学计数法:

3aaa=3

强比较的绕过大致有以下两种:

1.MD5绕过;比如:

由于 MD5 可以将数据映射到一个唯一的散列值,因此可以使用强类型比较符 === 来进行强相等的判断。例如:

php
$str1 = "Hello, world!";
$str2 = "hello, world!";

$hash1 = md5($str1);
$hash2 = md5($str2);

if ($hash1 === $hash2) {
  echo "两个字符串的 MD5 散列值相等";
} else {
  echo "两个字符串的 MD5 散列值不相等";
}
上述代码中,虽然 $str1 和 $str2 的值不相同,但是它们的 MD5 散列值都是 "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",因此输出结果为 "两个字符串的 MD5 散列值相等"。

或者给大家找了两个MD5解密后以0e开头的一串数字,

然后下面是MD5后以0e开头的数字,也是强相等的

a=MMHUWUV&b=QNKCDZO

2.数组绕过

当你遇到MD5强比较相等时,可以直接

a[]=1&b[]=2

因为:md5(),sha1()函数无法处理数组,如果传入的为数组,会返回NULL

NULL=NULL

这里顺便给大家普及下PHP科学计数法

1.0e开头跟数字的字符串(例如"0e111”)会当作科学计数法去比较,和0相等; (绕过强比较)

2.0x"开头跟数字的字符串(例如"0x1e111”)会被当作16进制数去比较; 布尔值true和任意字符串都弱相等。(绕过弱比较)比如:

a = "0x1e111";
$b = 123457;

if ($a == $b) {
  echo "相等";
} else {
  echo "不相等";
}
上述代码会输出结果 "相等",因为在进行弱类型比较时,字符串 "0x1e111" 会被转换为十六进制数 123457,与整数 123457 比较相等

3.数字+字符型时,只会读取前面的数字(例外:1e3aaa这样的字符串在比较时,取的是符合科学计数法的部分:1e3,也就是1000)(绕过弱比较)

例子:

$a = "2sadsad";

$b = 2;

if ($a == $b) {

echo "相等";

}

else {

echo "不相等";

}

这里是弱相等的

你可能感兴趣的:(php,安全)