挂号网站建设,搜狗搜索推广,wordpress数据库加密方式,鞋 东莞网站建设 技术支持正则绕过 正则表达式PHP正则回溯PHP中的NULL和false回溯案例案例1案例2 正则表达式
在正则中有许多特殊的字符#xff0c;不能直接使用#xff0c;需要使用转义符\。如#xff1a;$,(,),*,,.,?,[,,^,{。 这里大家会有疑问#xff1a;为啥小括号(),这个就需要两个来转义不能直接使用需要使用转义符\。如$,(,),*,,.,?,[,,^,{。 这里大家会有疑问为啥小括号(),这个就需要两个来转义但是中括号[]和大括号{}仅转义左侧。这样的原因是存在一个特殊含义组而中括号和大括号没有左侧就无法实现闭合也就无法编译。 当然里面也存在一个特殊符号“-”也是不需要转义的起到连接符的作用主要使用在[]中当做普通文本即可。
除了一些特殊字符还有一些特殊符号的表示像\d,\D,\s,\S,\w,\W,\b,\B。
还存在一些机制像贪婪匹配惰性匹配又比如存在断言像先行肯定断言、先行否定断言。这里就不多说了。
PHP正则回溯
回溯可以简单理解为返回也就是在正则匹配时依次匹配如果产生不满足正则表达式的情况则向前依次返回搜索知道匹配到为止否则正则无法匹配。 举个例子 匹配正则/\d.*g.*/gm 正则表达的含义首先匹配\d也就是先数字匹配然后是.*全部匹配匹配字母g再全部匹配。 我们的案例给这个1234as23gsfggsw正常理解应该2步差不多了。 我们在regex101.com查看一下具体匹配了几步。 这里匹配了八步。 看一下第三步 和我们想的差不多基本已经匹配完了但是这个正则没有走完也就是说它回去匹配字母g再来看一下后面两步。 开始了我们前面提到的回溯开始从后往前匹配内容也就是字母g在匹配到后就会再向后匹配正则表达式。
在PHP中回溯不是无限的也就是说回溯步数是有限制的根据英文文档显示可以回溯1000000次这是一个很大的数字。
PHP中的NULL和false
作为弱数据型语言php的比较还是比较特殊的。 PHP存在严格比较和松散比较。严格比较也就是“”松散比较“”。 松散比较比较的仅是数据的值。 严格比较比较的是数据的值和类型。 PHP下也存在一些隐式转换将NULL和false进行转换 下面就展示一下NULL和false的比较
0 false: bool(true)
0 false: bool(false)0 null: bool(true)
0 null: bool(false)false null: bool(true)
false null: bool(false)0 false: bool(true)
0 false: bool(false)0 null: bool(false)
0 null: bool(false) false: bool(true)false: bool(false) null: bool(true)null: bool(false)很明显在严格模式下NULL和false相同。
回溯案例
案例1
?php
function areyouok($greeting){return preg_match(/Merry.*Christmas/is,$greeting); //正则匹配
}if(!areyouok($greeting)){if(strpos($greeting,Merry Christmas) ! false){ echo welcome to nanhang. .flag{i_Lov3_NanHang_everyThing};}else{echo Do you know .swp file?;}
}else{echo Do you know PHP?;
}
分析一下内容首先第一个函数里面是一个正则匹配正则匹配的内容是Merry然后任意字符然后是Christmas。 来到下面的判断先判断是否符合上面的正则不符合进入下一层否则返回打印然后又判断。 这里有意思的两个点是在判断上第一个判断是否符合正则正则则是一个字符串不符合进入下一个而下一个则判断字符串包不包含括号里的内容还要和false进行严格比较。也就是说呢要不是字符串还要和false不完全等。 首先大家想到的是第二个判断为true就好了但如果满足的话那就必须是字符串但第一个判断已经否定了。
理论成立但仍需要实测 首先字符串
所以这时候我们就要想到我们的NULL和false它们两个在严格比较下是相等的。 那这样要如何解决那greeting就不能为字符串且要为NULL数字就可以。 所以greeting[]123,就解决了。
案例2
?php
function areyouok($greeting){return preg_match(/Merry.*Christmas/is,$greeting);
}$greeting$_POST[greeting];
if(!is_array($greeting)){if(!areyouok($greeting)){if(strpos($greeting,Merry Christmas) ! false){echo Merry Christmas. .flag{i_Lov3_NanHang_everyThing};}else{echo Do you know .swp file?;}}else{echo Do you know PHP?;}
} else {echo fuck array!!!;
}
?
这个案例是上面的升级版在这里就没有办法使用NULL来实现绕过了这里对数组也进行了判断难度可见一斑。 但是我们要想到一个问题如果我们无法匹配正则那就绕过不就可以了。 上面我们提到了PHP也就只能回溯1000000次多了就不行了如果超了正则就匹配失败也是满足我们判断条件的所以我们只需要在字符串加一些不相干的内容一直回溯超过1000000次就可以了。 所以此时的greetingMerry Christmas ‘a’*1000000。