一般容易把 == 与 !== 混淆,认为 !== 是 == 的取反
实际上
-
== 与 != 同属弱类型比较
-
===与 !== 同属强类型比较
弱类型比较
$a==$b、$a!=$b
弱类型比较在比较之前会进行类型转换,再进行值的比较
特点(常用的绕过方式)
-
含数字的字符串
-
以数字开头的字符串,可以被字母、特殊字符、小数点截断的
格式:数字+字母/特殊字符/小数点
-
非数字开头的,含有数字的字符串被识别成0
-
#以数字开头的字符串或纯数字
#以下经过转换后都为123
echo 123=='123q'; #true,数字+字母
echo 123==123; #true,纯数字
echo 123=='123'; #true,数字字符串
echo 123==123.2; #true,浮点数
echo 123=='123.2'; #true,浮点数字符串
echo 123=='123@'; #true,数字+特殊字符
#其他进制,仅在纯数字时可以被识别
#若为数字字符串,会按照字符串转换数字的规则转换
echo 123==0x7b; #true,十六进制纯数字
echo 123=='0x7b'; #false,十六进制数字字符串,被字母截断
echo 123==0173; #true,八进制纯数字
echo 123=='0173'; #false,八进制数字字符串,八进制被转换为173
- 弱类型比较只会无视前空格,ctf中常用%20、%09、%0a、%0b、%0c、%0d、%a0代替空格
var_dump(' 123'=='123'); #true,前空格与无空格
var_dump('123 '=='123'); #false,后空格与无空格
var_dump(' 123'=='123 '); #false,前空格与后空格
var_dump('123 '==' 123'); #false,后空格与前空格
var_dump(' 123 '=='123'); #false,前后空格与无空格
var_dump(' 123 '==' 123'); #false,前后空格与前空格
var_dump(' 123 '=='123 '); #false,前后空格与后空格
补充:intval()会无视前后空格,is_numeric()会无视前空格
- 弱类型比较可以识别科学计数法(这一条常用于md5弱碰撞)
echo md5(QNKCDZO)==md5(240610708); #true
#很明显,加密后都以0e开头,被识别成科学计数法
#而以0e开头的科学计数法都被识别成0
md5(QNKCDZO) #0e830400451993494058024219903391
md5(240610708) #0e462097431906509019562988736854
强类型比较
$a===$b、$a!==$b
强类型比较会比较 $a 与 $b 的值和类型是否相同,相对于弱比较,安全性大大提高
标签:false,数字,echo,空格,123,类型,php,true,比较 From: https://www.cnblogs.com/IFS-/p/17290199.html