2013-12-16 30 views
0

我在想如何在sed中使用正則表達式原子組(non-capturing組)。原子組對於通過吞噬服務器內存來避免任何拒絕服務攻擊是非常有用的,所謂的災難性回溯,性能明智的原子組也非常有用。如何關閉sed中的回溯

找到以下鏈接,使用re2 engine關閉回溯。

您可以使用re2引擎(非反向引擎)完全關閉回溯。我的問題是爲什麼我們不能在sed中使用相同的方法,如果可能的話,我們如何在sed中定義一個原子組或非捕獲組。

謝謝

回答

2

你問幾個問題。答案之一有appeared before in SOsed不提供不匹配的贊助商。

要回答另一個問題,您只需要仔細閱讀re2的文檔。分支與結合匹配器如sed(以及PerlPython,Java等)和基於確定性有限自動機(DFA)的匹配器(如re2)所使用的機制在本質上是不同的。在sed的識別器中沒有cut操作,它將執行您想要的操作。

話雖如此,re2文檔忽略了其否定。編譯DFA比將正則表達式轉換爲例如由內部使用的字節碼要工作得多。 Perl的匹配器。因此,Perl程序不會因正則表達式編譯而變慢。事實上,re2編譯器可以在某些短正則表達式上「爆炸」,併產生正則表達式大小指數的DFA。因此,編譯器需要指數時間才能運行,並且技術將不良行爲從運行時移到編譯。

我同意re2傢伙的看法,總的來說,壞的行爲依賴於正則表達式比輸入更好。如果編程語言中的所有嵌入式正則表達式識別器使用re2方法,那將是一個更好,更安全的世界。

最後,您的問題似乎混淆了大小和運行時間。來自回溯識別器的DOS發生是因爲某些輸入需要指數時間以識別(或拒絕)輸入長度。由於正則表達式永遠不會捕獲超過(短)輸入長度,捕獲或缺少捕獲沒有效果。

您可能會想到的另一種DOS是用戶提供了一個怪物輸入,sed識別器被強制在內部存儲,因爲它只有非捕獲組,即使捕獲從不使用。這肯定是至少在sed的某些實現中出現問題的一種方法(假設智能實現可以確定不需要捕獲並跳過它;我認爲GNU代碼不會這樣做),但它只會在if你允許巨大的投入,這通常可以通過其他方式來防止。爲什麼sed中沒有非捕獲組?它歷史上是一個非常古老的程序,可以追溯到一些最早的Unix機器。那些日子裏人們並不擔心DOS。

0

您可以避免使用錨點回溯,並且在幾乎所有正則表達式引擎中都更加冗長。此外,捕捉組和非捕捉組的開銷差異很小,它們都只是保持輸入內的開始和結束偏移量。捕獲組具有污染後向引用命名空間的缺點。