2014-07-19 44 views
15

我想添加一個功能到我的網站,讓用戶搜索文本RegEx。但是,讓用戶做這樣的事情安全嗎?使用用戶的RegEx安全嗎?

preg_match('/' . $user_input_regex . '/', $subject); 
+3

您可能需要使用[preg_quote()](http://www.php.net/manual/en/function.preg-quote.php)將其轉義,並且不容易捕獲錯誤優雅地如果用戶輸入是格式不正確的正則表達式 –

+3

@MarkBaker但是,如果我通過preg_quote()轉義RegEx字符RegEx不會工作 –

+0

個人而言,該代碼對我來說看起來很好。我不是專家,但是這個命令不能編輯任何東西......他們能做的最糟糕的事情就是讓你搞砸了結果。但是,如果您正在運行來自不同用戶的RegEx,則情況會有所不同。 –

回答

12

對此代碼有一個可能的攻擊,稱爲ReDoS attack(正則表達式拒絕服務)。

的服務(重做操作)正則表達式否認是拒絕服務攻擊,它利用了大多數正則表達式實現可能會達到導致他們的工作非常緩慢(指數相關輸入尺寸)的極端情況。然後攻擊者可以使用正則表達式導致程序進入這些極端情況,然後掛起很長時間。

具體與preg_match有一個known issue可能導致PHP分段錯誤。

所以答案是否定的,因爲諸如這些問題而不安全。

+0

1.使用ReDoS,攻擊者只能放慢服務器速度,但除此之外無法造成任何損害,對吧? –

+0

2.請求內存超過內存限制後,PHP不會「出去」?我的意思是:我是否可以通過減少內存限制來防止問題發生,並且不會一次允許太多搜索? –

+1

@SdgsdgAsgasgf:1)除了讓你的服​​務器對所有請求沒有反應,沒有。 2)有[可能是段錯誤的解決方法](http://php.net/manual/en/function.preg-match.php#88587)。 – SilverlightFox

4

安全明智,你永遠不要信任用戶輸入,所以它取決於你對輸入做什麼。在給定的情況下,您至少應該跳過用戶輸入中使用的分隔符(反斜槓)以確保正則表達式正常工作。