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

5.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

6. 布尔值true和任意字符串都弱相等

7.进制转化法弱相等(很鸡肋,实战之中建议拿来绕过弱相等

<?php

$a = "4476";
$b = 010574;

if ($a == $b) {
  echo "相等";
} else {
  echo "不相等";
}


上述代码是相等的,因为0开头就是八进制的典型特征,所以经过转化后两者数值相等,没有问题。但是在网页上提交的数据是以字符串的形式传递给服务器的,包括数字。所以哪怕当你以 "?num=134233" 这样的形式提交数据时,在服务器端接收到的数据类型仍然是字符串。所以上面的代码就变成了”010574“==”4476“(现在这个是错误的),因为”010574“是个字符串,所以直接变成010576!=4476

强等于的绕过:目前主流就一个:

数组绕过

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

a[]=1&b[]=2

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

NULL=NULL

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

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

2.数字+字符型时,只会读取前面的数字(例外:1e3aaa这样的字符串在比较时,取的是符合科学计数法的部分:1e3,也就是1000,e-4就变成了就是乘上了10的-4次方)

例子:

(1)

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset(
$_GET['num'])){
    
$num $_GET['num'];
    if(
$num==4476){
        die(
"no no no!");
    }
    if(
intval($num,0)==4476){
        echo 
$flag;
    }else{
        echo 
intval($num,0);
    }
}

?num=4476e3

解答:弱比较不能等于4476,intval()结果是4476。

这里4476e3会变成4476000,所以不弱相等,而且intval在非字符串下才能够识别e的,但是这里是字符串(在网页上提交的数据是以字符串的形式传递给服务器的,包括数字。所以哪怕当你以 "?num=134233" 这样的形式提交数据时,在服务器端接收到的数据类型仍然是字符串。),所以这里会变成数字+字符串的方式变成4476.

再补充个小栗子:

<?php

$a = "2sadsad";

$b = 2;

if ($a == $b) {

echo "相等";

}

else {

echo "不相等";

}

这里是弱相等的

额,我下面显示不相等不是因为翻车了,不相等是由于PHP版本·过高了,官方对bug进行了修复,但是至少在7.1以前都有用(一般打比赛够用了)

这里推荐各位如果实战打比赛没有记住,那就像这样花一分钟写一个小脚本测试一下就可以了,

当然了,php版本别太高了

  • 25
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值