「Regex」 在數據驗證方面最受歡迎。考慮到您可能對「Regex」徹底陌生的。請參考我介紹Regex如何運做的視頻。 But because of the typical parsing logic of regex it is exposed to DOS attacks. Let us try to understand in detail what I mean by that. 可是因爲正則表達式典型的邏輯解析是暴露在DOS攻擊之下的。讓咱們嘗試瞭解一下細節來明白我爲何這麼說。
例如,咱們來看一下這個規則表達式-「^(\d+)$」。這個正則表達式的規則是隻有數字符合條件。你也能夠看一看下面描述正則表達式如何評估輸入信息的符號圖。如今,假設咱們想要驗證「123456x」。正以下圖所示,正則表達式將走六條路徑。正則表達式
可是若是咱們再擴展一位輸入參數,它將有七條路徑。也就是說,隨着輸入參數長度的增長,正則表達式的驗證須要更多地時間來驗證。即:驗證所需時間和輸入參數的長度爲線型關係。c#
如今讓咱們把前面的表達式「^(\d+)$」複雜化爲「^(\d+)+$」。若是你意識到了這個正則表達式寫的很是複雜。並且咱們想驗證「123456x」。它將執行32條路徑。 若是你再添加一個字符,它遍歷的路徑將變成64條。spa
也就是說,對上述正則表達式而言,驗證輸入參數的長度與消耗時間是指數關係。3d
如今,你可能會問:這些有關係嗎?可是我要說的是:當正則表達式執行線性相關的驗證時,這個特色可能被黑客利用,以實現DOS攻擊。他們能夠輸入很是長的字符串,使你的應用永遠處於掛起狀態(始終處於正則驗證狀態)。
一個比較合適的解決方法是:設置正則操做的超時限制。好消息是,在.NET4.5中,你能夠像下面所示代碼那樣,爲正則驗證添加一個超時屬性。因此,若是你收到任何類型的惡意注入時,你的應用不會陷入死循環。code
1
2
3
4
5
6
7
8
9
|
try
{
var regEx =
new
Regex(@」^(\d+)+$」, RegexOptions.Singleline, TimeSpan.FromSeconds(2));
var match = regEx.Match(「123453109839109283090492309480329489812093809x」);
}
catch
(RegexMatchTimeoutException ex)
{
Console.WriteLine(「Regex Timeout」);
}
|
來自:視頻
http://www.itstrike.cn/Question/10777f22-b683-45ee-a957-c38368823a01blog