数字与字符串
- 十进制数字表示法: 数字类型
0x十六进制
0八进制
0b二进制
数字e数字
都会 自动转化为 等值十进制值
- 字符串内ascii转义: 双引号字符串中用
\x两位十六进制
\三位八进制
转义字符 可代表对应ascii码的字符
- 自动转换截取: 当字符串参与计算或 与数字/纯数字字符串 进行判断时, 会将字符串截取为数字 (如
'123a'==123 '123a'>12 '0x00'=='0'
,但'123a'!=='123b' '123a'!===123
不是所以不相等) 系统会从开头开始截取数字 (开头若为空白符会跳过空白符), 直到遇到字符串或第二个小数点
- 纯数字字符串: 若一直截到字符串结束, 则为纯数字字符串 php<7时, 截取的格式包括
数字e数字 0x十六进制 0八进制 0b二进制 以及在数字前的+与-
php>=7时, 截取的格式只有 数字e数字 以及在数字前的+与-
若运用格式, 可不截取到结束(因有特殊字符结束截取), 但并不为纯数字字符串 数字e数字
前面数字
不能有字符, 而后面数字
有字符会结束截取
- (int)转化: 与自动转换截取相同 不同: php<7时, int不识别截取的格式, php>=7时, 识别
数字e数字 以及在数字前的+与-
变量覆盖
$$
变量覆盖: 当$$变量名
中变量名
可控时, 则可操控任意变量, 只需将变量名
改为对应名称
- parse_str: 将以 url查询字符串格式的字符串解析为变量并设置到当前作用域 (有result参数则存在该数组, 且该数组原内容会被覆盖, string中空格必须转换为+)
- extract: 从数组中将变量导入到当前的符号表
报错停止执行
- Fatal报错截断执行: 当报错Fatal时, 这行代码前的执行, 这行代码后的不执行 发生: 结尾没分号 或 语法错误
- Parse报错不执行: 当报错Parse时, 所有代码不执行 发生: 执行不存在的函数与类
- 代码执行函数: 在代码执行函数里的代码, 也遵循这样的规则, 但在代码执行函数中的报错Fatal和Parse, 在函数内部遵循上述规则, 但在函数外部的效果都与Fatal相同
索引
- 在php<8时, 数组索引为字符串时, 使用索引可不使用引号包围 如
$a[a]=1;
(其中php为7.4时会warning,但仍可正常执行)
- 在php>=8时, 数组索引为字符串时, 使用索引必须有引号, 不然会报错
$a['a']=1;
传参参数名替换
- 特性: 参数名种出现
点
和空格
时, 会自动将其替换为_
- 绕过(php<8): 如果参数中出现中括号
[
,中括号会被转换成下划线_
,但是会出现转换错误导致接下来如果该参数名中还有非法字符
并不会继续转换成下划线_
,也就是说如果中括号[
出现在前面,那么中括号[
还是会被转换成下划线_
,但是因为出错导致接下来的非法字符并不会被转换成下划线_
$_REQUEST
绕过
- 特性: 当
$_REQUEST
在同时接收GET和POST参数时,POST优先级更高, 会覆盖掉同名GET参数
MD5相等绕过
- 0e绕过(弱相等)**原理**: 若两边经MD5加密后的值为0exxx形式, 会被当作科学计数法, 而且结果为零,都是相等的
MD5加密后0e开头: QNKCDZO,240610708,s878926199a,s155964671a,s214587387a,s214587387a
sha1加密后0e开头: aaroZmOk aaK1STfY aaO8zKZF aa3OFF9m 0e1290633704 10932435112
双重MD5加密后0e开头: 7r4lGXCH2Ksu2JNT3BYM CbDLytmyGm2xQyaLNhWn 770hQgrBOjrcqftrlaZk
0e开头字符串加密后0e开头: 0e215962017
- 数组绕过(强相等)(php<8) 原理: md5()与sha1()无法处理数组, 若传入的为数组, 会返回NULL,
NULL===NULL
- NAN绕过(强相等) 原理: NAN与任何数据类型(除了true)做强/弱比较均为false, 包括和NAN比较, 而md5(NAN)为一固定值 利用: 当可以构造NAN时, 即可绕过
正则
- 修饰符i: 忽略大小写 m: 多行模式,
$与^
匹配每一行的行尾与行首, 而非整个字符串的尾部与首部 (只识别%0a
,而不识别%0d
) s: 点号匹配所有字符 x: 忽略空白字符 u: UTF-8模式 A: 强制从目标字符串开头匹配 D: 美元符号仅匹配字符串结尾
相等
-
弱相等
false 与 true
字符串中 � 和 \ 和 空数组 空对象 与false弱相等, 其它任意字符串 数组 对象 与true弱相等 , if等判断语句中都是将表达式结果与true进行弱相等并根据结果执行
-
强相等
- 强相等 不同进制 但代表值相同 的数(包括科学计数法)强项等, 但当在引号中, 因为不会自动转化为数字, 所以不强相等(但弱相等)
感叹号
- !null为true, 所以若函数返回值不为bool, 一般函数使用失败时(warning)时返回值为null或false, 若在函数前加上!, 则会变为1
!0 ![] !{}
等空数据 为true
OR与|| AND与&&
- 特性: or与and 的优先级 低于 ||与&&, 且or与and的 优先级低于 赋值
=
符号
其它