php弱类型比较与强类型比较

一般容易把 == 与 !== 混淆,认为 !== 是 == 的取反

实际上

  • == 与 != 同属弱类型比较

  • ===与 !== 同属强类型比较

弱类型比较

$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 的值和类型是否相同,相对于弱比较,安全性大大提高

附上一篇弱语言底层原理的连接

posted @ 2023-04-05 18:10  kazie  阅读(216)  评论(0编辑  收藏  举报