今天看了一篇文章說下自己的理解
文章地址: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~");
}
這樣就不會報錯了!
然后看了下面的評論酒館師傅說代碼審計中存在,以后在代碼中也需要多多關注!