2016-09-26 64 views
2

我需要在網頁上顯示一個字符串內容(我沒有控制權)。除了某些有限數量的HTML標籤(強,em,p,br)外,所有東西都應該顯示。這些應該得到尊重,我的理解是可以安全地讓它們不被轉用。其他一切都應該按原樣顯示。.NET中的選擇性HTML編碼(除了某些標籤以外的所有東西)?

令人驚訝的是,大多數HTML Sanitizer都是真正的侵入性,因爲它們適合去除他們認爲是「不安全」的東西。這是爲什麼?他們爲什麼不拖延而不是去掉?我應該保留沿線

var encoded = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode("string content"); 
var encodedWithSafeTagsReenabled = encoded.Replace("&lt;strong&gt;", "<strong>"); 

2016年有沒有更清潔,更強大的方式在.NET生態系統中做到這一點?再次,尊重標籤的白名單並保留(編碼,而不是刪除)其他一切?要明確,這將用於將內容放置在網頁上的特定div(我知道編碼應該是基於OWASP XSS備忘單的上下文相關)。

+0

大多數HTML消毒劑依賴於實際構建一個文檔模型,並與節點的工作,而不是試圖裂傷一個字符串。因此,無效HTML必須被移除或以其他方式「固定」,否則構建文檔模型將失敗。 –

+0

謝謝,理解。他們構建DOM或其​​他任何東西,但我的問題是爲什麼他們最終傾倒到一個字符串時沒有默認編碼?爲什麼他們必須插入並刪除?如果內容甚至不是有效的DOM?我要求他們清理html輸出的任意字符串(不檢查html有效性)。 – Blinky

+0

再次,*他們是如何工作*。當處理類似HTML的東西時,你必須1)使用正則表達式,這是昂貴和容易出錯的,或者2)構造某種內存中基於類的表示來進行修改,然後將其平坦化爲一個字符串。大多數使用HTML的庫選擇第二條路徑,這意味着它們必須依賴*標準*來構建該對象圖。這進一步意味着任何不符合這些標準(無效)的東西都必須丟棄或以其他方式處理。 –

回答

0

刪除當然是最安全的選項。如果我們只對html進行編碼,那麼如果還有其他地方存在XSS錯誤,它可能是un-hmmlencoded。

例如,這jQuery腳本:

var searchText = searchstring.text(); 
if(noResults) 
{ 
    $("div.noResults").html("no results found for <b>" + searchText + "</b>"); //boom 
} 

是否有一個更清潔,更可靠的方式在2016年爲此在.NET生態系統?再次,尊重標籤的白名單並保留(編碼,而不是刪除)其他一切?

你可以做到這一點與HtmlSanitizerNuGet)庫,並使用RemovingTag事件:

var sanitizer = new HtmlSanitizer(); 
sanitizer.RemovingTag += (sender, args) => 
{ 

    var tag = args.Tag; 

    args.Cancel = true; 
    tag.OuterHtml = WebUtility.HtmlEncode(tag.OuterHtml); 

}; 
相關問題