2016-03-04 22 views
0

我計劃在我的服務中提供正則表達式支持,這樣我的用戶就可以配置一個正則表達式,並且如果字符串與正則表達式匹配,字符串將被處理。正則表達式中沒有單獨的括號會阻止ReDOS?

然後,我偶然發現了這些文章:

OWASP ReDOS

blog.makensi.es

,發現有個簡單的正則表達式可以在我的服務器災難性的。

我只需要基本的匹配能力。

我打算從正則表達式中去除括號,如果它是一個有效的正則表達式,它將被處理。我相信單獨剝離括號就足以將我的服務器從這些攻擊中拯救出來。

我是對的還是錯過了什麼?

+0

什麼,只是放大所有的括號甚至沒有看?如果實際需要的是parens,並且您將其刪除,則結果可能在語法上有效,但它將是一個不同的正則表達式。你會怎樣處理那些用反斜槓或角色班或兩者都逃跑的人?您是否使用支持非捕獲組,原子組,lookaheads,lookbeheads,分支重置組,條件的正則表達式...? –

+0

我正在嘗試提供模式匹配支持。我以爲我可以簡單地使用正則表達式,但發現了邪惡的正則表達式。我只是想知道,如果不支持單獨組合,將會防止任何邪惡。但從已被接受的答案中得知,這還不夠。 – Vigneshwaran

回答

1

是的,這將是一個天真的做法,並會讓您的服務器易受DOS攻擊。

你給自己其實第一個環節是相當不錯的和免費到它,你可以看看:How can I recognize an evil regex?

但是現在看來似乎是一項艱鉅的任務,以檢測這種邪惡的正則表達式。這取決於你想要承擔多少風險?一種解決方案可能是構建一個產生進程/線程的機制(取決於你的平臺),該進程/線程用給定的正則表達式評估輸入字符串併爲其設置超時。一旦這個過程需要很長時間(只要你負擔得起),你可以殺死它。

1

您運行的風險高度依賴於您的特定正則表達式庫。經典的「失控」RE(本質上)aa?重複N次,與N a的字符串匹配。它在PHP,Python和Perl的默認庫中大致呈指數級時間運行,Common Lisp的CL-PCRE(perl兼容)和Go的正則表達式包(POSIX正則表達式)的時間大致爲線性。

請注意,aa?aa?aa?沒有括號。

+0

這回答我的問題。 也提到這個問題http://stackoverflow.com/questions/12841970/how-can-i-recognize-an-evil-regex?lq=1並發現'a {0,1000} a {0,1000 }'和'a * b * [ac] * $'也是邪惡的正則表達式,即使它們沒有括號。 – Vigneshwaran