PHP正則反斜杠的講究


今天看了一篇文章說下自己的理解

文章地址: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~");
}

這樣就不會報錯了!

然后看了下面的評論酒館師傅說代碼審計中存在,以后在代碼中也需要多多關注!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM