這裏有幾件事情需要考慮。首先,你有ASP.NET Request Validation,它會捕獲許多常見的XSS模式。不要完全依賴這一點,但它是一個很好的小增值。
接下來,您要驗證輸入與白名單,在這種情況下,您的白名單是所有符合預期的URL結構。嘗試使用Uri.IsWellFormedUriString針對RFC 2396遵守和RFC 273:
var sourceUri = UriTextBox.Text;
if (!Uri.IsWellFormedUriString(sourceUri, UriKind.Absolute))
{
// Not a valid URI - bail out here
}
AntiXSS具有Encoder.UrlEncode這是偉大的編碼串附加到一個URL,即在查詢字符串。問題是,你想採取原始字符串和而不是轉義字符,如正斜槓否則http://troyhunt.com
結束爲http%3a%2f%2ftroyhunt.com
,你有問題。
當你編碼的上下文是HTML屬性(它的「href」屬性你設置),您要使用Encoder.HtmlAttributeEncode:
MyHyperlink.NavigateUrl = Encoder.HtmlAttributeEncode(sourceUri);
這意思是,一個像http://troyhunt.com/<script>
這樣的字符串將會被轉移到http://troyhunt.com/<script>
- 但當然,請求驗證會首先捕獲那個字符串。
另請參閱OWASP Top 10 Unvalidated Redirects and Forwards。
哇,這實際上包含在我的標籤列表中。我不知道這是一個真正的圖書館。這似乎滿足我的需求,然後一些(如JavascriptEncode) – Earlz 2011-04-21 04:40:49
哇MSDN文章是非常過時的 - AntiXSS庫下載和源可以在http://wpl.codeplex.com找到。 – blowdart 2011-04-22 14:34:33
對於那些遇到這個頁面的人來說,AntiXSS庫的一部分現在將被捆綁在up.net的ASP.net 4.5版本中http://www.asp.net/vnext/whats-new#_Toc303354468 – 2011-10-26 11:36:29