PHP中的preg_replace函数
问题提出
最近在土司上面看到一个求助的帖子,是关于这个函数的对注入的过滤的
包括下面很多人,都是在说这个规则是过滤所有的非字母和数字的
相信,其实开发人员也是这么想的
但是这个正则写的有问题
因为这是两个正则块一起匹配,就相当于第一个字符是个特殊符号,第二个只要是个数字
就不会被匹配到
如下图
那这个正则应该怎么写呢
preg_replace("/([^a-z]|[^0-9])/","",$str);
可以看出来了这是一个正则的缺陷,但是要想 构造SQL
语句,还需要知道的是
preg_replace
函数的匹配规则
这个可能以后会用的到就是关于整合表达式组合匹配的问题
这里主要提出的问题就两个
对于这个匹配的组合,函数是怎么组合的?
在
preg_replace
中是先匹配后删除,还是匹配和删除是同时进行的?
对于上述问题,在之前遇到的一些CMS
中,我个人也忽略了这方面的探索
探索
假设
匹配组合的形式
假设存在1、2、3、4
四个字符串
- 顺序组合:
1&2
和3&4
(A-1
) - 顺序排列组合:
1&2
、2&3
、3&4
(A-2
)
删除模式假设
- 先全部匹配,再进行删除 (
B-1
) - 匹配和删除同时进行 (
B-2
)
假设组合
共有四种组合形式
A-1
和B-1
A-1
和B-2
A-2
和B-1
A-2
和B-2
排除影响因素
首先可以排除掉A-1
的组合
我们可以使字符串的字符个数为奇数,这样无法构成循序组合
理论上最后一个字符,会被轮空不匹配
'10'30a
测试结果,可以看到最后一个字符a
被删除
现在还剩下两种可能
测试字符
'10'a0b
预期结果
A-2
和B-1
- 分解后为
[[',1],[1,0],[0,'],[',a],[a,0],[0,b]]
- 其实这种想想也不可能,可能存在一个组合中需要删,另外一个不删的情况
- 按照需要删除来看
'1
- 分解后为
A-2
和B-2
- 从
[0,']
不符合删除,删除后就不存在了[',a]
组合 '1a
- 从
代码测试
所以这里大概清楚了匹配模式
针对上面的注入问题
结果
在所有的非数字字母前或者后加一个 数字和字母的组合,比如:0x
1 |
|