在基于PCRE实现的正则引擎中,我们常使用“m表示multi-line、s表示single-line”。

multi-line表示按行来匹配正则,可以理解为以换行符为切割,对每行进行正则匹配然后进行or运算出结果。
中single-line的意思是将待匹配的文本视为一行,换行符不再作为“换行”的标志。

这在日常使用中也经常会出现由首尾界定符产生的小bug,比如下面这一个。

<?php 

if(preg_match('/^a[a-z]+z$/m', $_GET['input'])) {   //匹配a开头 z结尾

    echo $_GET['input']; 

}

正则匹配中我们常使用`^`和`$`来界定正则匹配的首尾,但这两个的符号本身的含义其实是代表了“行的开头和结尾”,也就意味着如果你输入一个%0a换行,后面就可以输入任何字符也能完成匹配。

比如上面的代码本身的含义可能是:用户输入一个以a开头,以z结尾的中间可以有若干字母的字符串。但因为指定了m修饰符,导致用户可以传入:

input=abcz%0a<svg%20onload=alert(1)>

来绕过检测。   有些地方是可以有效的。

 

相关文章:

  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
  • 2021-07-20
  • 2022-03-08
  • 2021-10-30
  • 2021-12-22
  • 2021-09-23
猜你喜欢
  • 2021-11-01
  • 2022-12-23
  • 2021-10-07
  • 2019-01-16
  • 2020-07-24
  • 2022-12-23
  • 2021-10-06
相关资源
相似解决方案