2014-01-31 189 views
1

在閱讀ASP.NET request validation causes: is there a list?後關於什麼導致ASP.NET抱怨危險的投入,我決定編寫自己的正則表達式在RegularExpressionValidator中使用。爲什麼此ASP.NET RegularExpressionValidator驗證危險的HTML不起作用?

我創建了測試點2和3特拉維斯的接受的答案正則表達式...

  • 2 - 如果&字符在&#序列(例如, 對非破空間),這是一個「危險的字符串」。
  • 3 - 如果<字符是<x部分(其中 「x」 是任何字母字符A-Z),<!</,或<?,這是一個 「危險的字符串」。

^()(&#)+ |(< [!?A-ZA-Z/\])+()$

這似乎工作的偉大使用regexlib.com上的測試儀,因爲它匹配你所期望的所有東西,而且你不會。

但是當我使用的表達上的ASP.NET的RegularExpressionValidator驗證大火上任何文字的!它在Firefox或IE上也是如此,無論EnableClientScript是true還是false。我使用.NET 4.5.1,但我不認爲這有什麼區別。 任何想法爲什麼以及如何解決它或爲什麼它不工作?

+0

我不確定你的意圖,不管你是隻是作爲一個練習來寫這個,還是你想在你的應用程序中使用它,但我建議允許HTML輸入,並集中精力編碼輸出有必要的。如果輸出不正確,「危險HTML」只是危險的。請參閱[OWASP XSS備忘單](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet)瞭解更多信息。 – SilverlightFox

+0

我不知道我是否看錯了,我試圖讓「安全」的輸入,但驗證器匹配「不安全」的輸入,所以即使匹配的工作,它會精確地匹配我想要的相反? –

+0

在ASP.NET中,如果用戶試圖提交表單並且可能存在潛在的危險輸入,則會引發HttpRequestValidationException。您可以通過關閉請求驗證來阻止這種情況的發生,但我不想繞過請求驗證(因爲這是安全性的重要組成部分),所以我需要一種優雅的方式來處理請求驗證失敗的最常見方式,以便用戶可以糾正輸入而不是其他任何事情。我可以寫一個自定義驗證器來做到這一點,但我認爲一個正則表達式會更好。 –

回答

1

我沒有看過ASP.NET RegularExpressionValidator和regexlib.com的解析器之間的區別,但我敢打賭,你的正則表達式有問題。

當我想你的正則表達式regexpal.com,它沒有匹配任何我希望它匹配(也許我沒有正確理解,但要求)。

編輯

下面將匹配一個字符串,它包含以下字符串:

  • &#
  • <a-z
  • <!
  • </
  • <?

這就是:

^((?!(&#)|(<[a-zA-Z!/\?])).)*$ 

See it in action at RegexPal.com

請參閱this question逆正則表達式的細節。

我原來的答覆(的要求相反)

我想出了這個,讓點2之前和之後的任何字符或任何字符前和後點3

這就是:

^.*(&#)+.*$|^.*(<[a-zA-Z!/\?])+.*$ 

View on RegexPal

+0

使用&#在它或<之後輸入字母或!或/或?不應該被允許。所以「淘氣&#輸入」將是不允許的,但「淘氣&輸入」將被允許,「調皮<@wibble」是允許的,但「淘氣

+0

請參閱我的編輯 - 我認爲新的正則表達式就是你之後 – theyetiman

0

我想這就是你要找的:

&#[!?a-zA-Z/]+

雖然,我不明白你的問題非常好,所以我可能需要一些修正。