2011-04-21 71 views
1

我正在閱讀一些問題,試圖找到一個很好的解決方案來防止用戶提供的URL中的XSS(它變成鏈接)。我發現one for PHP,但我似乎無法找到任何.Net。ASP.Net是否有任何反XSS庫?

要清楚,我要的是一個圖書館,這將使用戶提供的文本安全(包括Unicode陷阱?),讓用戶提供網址安全(在aimg標籤使用)

我注意到, StackOverflow具有非常好的XSS保護,但遺憾的是MarkdownSharp的部分Markdown實現似乎缺失。 (我用很多我的內容使用MarkdownSharp)

回答

6

Microsoft has the Anti-Cross Site Scripting Library;你可以先看看它並確定它是否適合你的需求。他們也有some guidance關於如何避免XSS攻擊,如果您確定他們提供的工具不是您真正需要的,可以遵循這些攻擊。

+0

哇,這實際上包含在我的標籤列表中。我不知道這是一個真正的圖書館。這似乎滿足我的需求,然後一些(如JavascriptEncode) – Earlz 2011-04-21 04:40:49

+0

哇MSDN文章是非常過時的 - AntiXSS庫下載和源可以在http://wpl.codeplex.com找到。 – blowdart 2011-04-22 14:34:33

+1

對於那些遇到這個頁面的人來說,AntiXSS庫的一部分現在將被捆綁在up.net的ASP.net 4.5版本中http://www.asp.net/vnext/whats-new#_Toc303354468 – 2011-10-26 11:36:29

0

我想你可以自己做,通過創建一個數組的字符和另一個數組與代碼,
如果你發現字符從數組中取代它與代碼,這將幫助你! [但是絕對不是100%]

字符數組
<
>
...

代碼陣列
& LT;
& gt;
...

+0

嗯,我知道我可以做我自己,但我寧願用別人是因爲我不是所有的XSS是知識淵博,我不想在我製作的產品中存在漏洞 – Earlz 2011-04-21 04:31:56

2

這裏有幾件事情需要考慮。首先,你有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/&lt;script> - 但當然,請求驗證會首先捕獲那個字符串。

另請參閱OWASP Top 10 Unvalidated Redirects and Forwards

+0

AntiXSS將在週末的測試版中有EncodeUrlPath :)但是,UrlEncode不會做它命名爲不幸的事情。我無能爲力 - 它完成框架功能:) – blowdart 2011-04-22 14:33:42

0

我依靠HtmlSanitizer。它是一個 。用於清理可能導致XSS attacks的構造的HTML片段和文檔的.NET庫。 它使用AngleSharp解析,處理和呈現HTML和CSS。

由於HtmlSanitizer基於健壯的HTML解析器,因此它也可以避免故意或意外 「標籤中毒」,其中一個片段中的HTML無效可能會破壞整個文檔,從而導致破損的佈局或樣式。

用法:

var sanitizer = new HtmlSanitizer(); 
var html = @"<script>alert('xss')</script><div onload=""alert('xss')""" 
    + @"style=""background-color: test"">Test<img src=""test.gif""" 
    + @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>"; 
var sanitized = sanitizer.Sanitize(html, "http://www.example.com"); 
Assert.That(sanitized, Is.EqualTo(@"<div style=""background-color: test"">" 
    + @"Test<img style=""margin: 10px"" src=""http://www.example.com/test.gif""></div>")); 

有一個online demo,再加上還有一個.NET Fiddle你可以玩。

(副本從他們的自述/粘貼)