在基于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)>
來繞過檢測。 有些地方是可以有效的。
作者:求知魚
出處:https://home.cnblogs.com/u/Qiuzhiyu
-------------------------------------------
個性簽名:你有一個蘋果,我有一個蘋果,我們交換一下,一人還是隻有一個蘋果;你有一種思想,我有一種思想,我們交換一下,一個人就有兩種思想。
如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,部落客在此感謝!
獨學而無友,則孤陋而寡聞,開源、分享、白嫖!