一、定义
PHP中的弱比较运算符,可以实现一些比较奇怪的比较方法,常见于各种CTF题目的绕过中,使用两个等号 == 比较,只比较值,不比较类型。
二、字符串与数字
php中其中两种比较符号:
\=\=:先将字符串类型转化成相同,再比较
\=\=\=:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用\=\=时,字符串会先转换为数字类型再比较var_dump('a' == 0);//true
,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0var_dump('123a' == 123);//true
,这里'123a'会被转换为123var_dump('a123' == 123);//false
,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false
<、>、<=、>=都存在和\=\=相同的弱类型,原理相同!!!
三、布尔true与任意值
var_dump(True == 0); //bool(false)
var_dump(True == 'False'); //bool(true)
var_dump(True == 2); //bool(true)
四、hash值和字符串“0”
$str1 = "a";
echo md5($str1); //0cc175b9c0f1b6a831c399e269772661
var_dump(md5($str1) == '0'); //bool(false)
---------------------------------------------------------
$str2 = "s224534898e";
echo md5($str2); //0e420233178946742799316739797882
var_dump(md5($str2) == '0'); //bool(true)
---------------------------------------------------------
$str3 = 'a1b2edaced';
echo md5($str3); //0e45ea817f33691a3dd1f46af81166c4bool
var_dump(md5($str3) == '0'); //bool(false)
---------------------------------------------------------
var_dump('0e111111111111' == '0'); //bool(true)
本质上是科学计数法与0的比较,0e开头的、后面为数字的字符串会被当做科学计数法进行解析,0的不论多少次幂都为0。
五、strcmp函数
strcmp(s1,s2)
说明:
当s1<s2时,返回为负数 注意不一定是-1,测试结果是比较字符串长度
当s1\=\=s2时,返回值= 0
当s1>s2时,返回正数 注意不一定是1,测试结果是比较字符串长度
如果两个字符串不同等,但是字符串长度相同,就比较从哪一位开始不同的,然后比较那一位的大小。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B" "a">"A" "computer">"compare"
特别注意:strcmp(const char *s1,const char * s2)
这里面只能比较字符串,不能比较数组形式的参数,如果出现了数组,则会retrun null
,有些题目就是利用这一点来进行和0
的完成比较。