今天看了一篇文章說下自己的理解
文章地址:https://www.t00ls.net/articles-55906.html
先看一段代碼,看起來很正常,但是實際上這段代碼會報錯!
if(preg_match("#\\\\|\\#i",$cmd,$match)){
var_dump($match);
echo ("forbid~");
}
它會報錯,報錯的信息是 結束分隔符 不存在,這里指的 結束分隔符 實際上在PHP正則中就是 定界符 !

再看這段,只是前后換了下位置 發現就不會報錯了!
if(preg_match("#\\|\\\\#i",$cmd,$match)){
var_dump($match);
echo ("forbid~");
}
那么問題肯定出現在\\上,我們對 $cmd 進行傳數據來匹配
$cmd => \ 單個反斜杠 結果 無匹配
$cmd => \\ 兩個反斜杠 結果 無匹配
發現結果都不匹配!
那么來看看 \\ 的問題所在,其實這里正則中的\\ 的解析流程是這樣的:
1、 \\ 先經過PHP正則解析器為一個\
2、\ 又跟'|'結合到一起,從而在 正則表達式的解析器解析為\|
3、又因為'|'是正則中的保留符號,所以需要一個轉義符來轉義,所以\\|這個的結果就是匹配 '|'
4、后面又跟了\\\\,這里 先經過PHP正則解析器為 \\,然后在經過 正則表達式的解析器為 ''
5、那么最后的正則表達式就是匹配|\ 這兩個符號!
那么也就可以理解上面的那個為什么會報錯了,因為結果就是匹配\#,所以我們還需要加個 定界符#,來進行修復
if(preg_match("#\\\\|\\##i",$cmd,$match)){
var_dump($match);
echo ("forbid~");
}
這樣就不會報錯了!
然后看了下面的評論酒館師傅說代碼審計中存在,以后在代碼中也需要多多關注!
