2012-08-16 43 views
10

我正在尋找一個很好的HTML清理器來在ASP.NET項目中使用。問題在於,衛生消毒劑必須支持可能包含CSS屬性的樣式屬性,這些屬性也必須進行消毒處理。到目前爲止,我還沒有找到一個好的產品來使用。在我咬下子彈並寫下自己的消毒劑之前,我想我可能會試着先看看這裏的人在用什麼。用於.NET的HTML Sanitizer支持樣式標記

庫,我已經看了,並拒絕:

  • AntiXSS庫(舊版本是不安全的,新版本帶風格的標記)
  • AntiSamy .NET(無人維護,缺乏在.NET必要的功能版本,擁有過時的依賴)
  • 的HTMLAgilityPackSanitizer在AjaxControlToolkit(逃逸風格標籤)

理想的做法是有一個基於白名單消毒劑塔t還會根據已知值或正則表達式的列表驗證屬性值。

任何人都能指出我正確的方向嗎?

+0

[HTML整潔(http://tidy.sourceforge.net/)是舊的,但我已經成功使用過它。 – transistor1 2012-08-16 03:18:15

+0

雖然我不確定這是我在找什麼。這裏的主要目標是確保用戶輸入不包含可執行腳本。 HTML Tidy看起來不錯,但似乎有一個非常不同的目的。 – 2012-08-16 16:40:52

回答

0

泰勝Oddie ASP.Net MVP - http://blog.tatham.oddie.com.au/2009/06/15/released-xhtml-markup-sanitizer/

現在我已經提到這幾個人。可能不是你想要的一切,但泰勝的一個真棒編碼器,所以應該給你很多的想法......

剛上AntiXSS,據我所知,新版本在HTMLAgilityPackSanitizer

+0

謝謝,但這些都不適合我的目的,因爲它們都在屬性內編碼特殊字符。這對安全性很好,因爲在樣式屬性中有很多XSS黑客可以做,但我需要能夠允許這些好東西。 :-( – 2012-08-16 04:27:57

3

CsQuery(這我是作爲操作HTML的工具的主要作者)。

這是一個.NET jQuery端口,它通過您在客戶端(DOM和jQuery的API)上使用的相同方法爲您提供對HTML的完全訪問。這使得推出自己的消毒劑非常容易。

Rick Strahl最近有一個blog post關於消毒HTML。他展示瞭如何使用HTML Agility Pack的規則來實現它,我發佈了一條評論,展示瞭如何使用CsQuery更輕鬆地實現相同的功能。基本是僅此,給出的標籤BlackList枚舉:

CQ doc = CQ.Create(html); 

// creates a grouped selector "iframe,form,script, ..." 
string selector = String.Join(",",BlackList); 

// CsQuery uses the property indexer as a default method, it's identical 
// to the "Select" method and functions like $(...) 

doc[selector].Remove(); 

如果您不想在一些標籤實際刪除內容,例如也許格式化你想禁止的標籤,你可以使用jQuery的解包。這將有刪除標籤,但保留其子女的影響。

doc[selector].UnWrap(); 

當你完成:

string cleanHtml = doc.Render(); 

有在裏克斯後清理JavaScript事件屬性,更重要的等等,但基本上CsQuery是一個熟悉而又簡單的方式來操作工具箱HTML。應該很容易創建一種能夠以您想要的方式工作的消毒劑。

CsQuery的DOM模型還包含方法來直接訪問樣式(例如,在不僅僅是操縱串更方便的方式),如果你需要做類似的東西刪除某些指定的樣式。例如,你可以從所有元素中刪除「字體重量」的風格:

// use the [attribute] selector to target only elements with styles 

foreach (IDomObject element in doc["[style]"]) { 
    if (element.HasStyle("font-weight")) { 
     element.RemoveStyle("font-weight"); 
    } 
} 

CsQuery的主要缺點,現在是文檔。它的API旨在儘可能地匹配瀏覽器DOM和jQuery(鑑於jQuery和C#之間的語言差異),並且公共API得到了很好的評論,所以它應該足夠簡單,以便在開始時進行編碼。

但是有一些非標準方法(如「HasStyle」和「RemoveStyle」)是CsQuery獨有的。不過,基本用法在github上的自述文件中涵蓋得非常好。它也在Nuget上爲CsQuery

+0

很酷,如果我最終滾動了我自己的消毒劑,那看起來好像是一個很好的工具, – 2012-08-16 15:58:17

+0

我打算讓這個去做一下我自己的白名單消毒劑,我假設我可以使用「全部」選擇​​器,然後迭代和解包任何不在我的白名單(或可能使用非謂詞選擇器,如果它們存在?) – Schneider 2012-10-30 12:41:50

+0

我想不出一個不起作用的理由,我沒有一個很好的意識是,這樣做是否會比使用標籤選擇器僅僅定位您想要的標籤(與我給出的黑名單示例相同的技術)相比效率更高或更低,可能取決於好壞比例,但對於這個目的可能是如此少量的內容,它不會真的影響任何一方。 – 2012-10-30 16:59:50

0

試着看看張貼在開放實驗室博客上的HtmlSanitizer:http://roberto.open-lab.com/2010/03/04/a-html-sanitizer-for-c/。這個支持樣式標籤,並且非常適合用於html編輯器。

+0

謝謝。這是我見過的最接近的,但我不是黑名單方法的粉絲。例如,即使您可以通過行爲在IE中執行腳本,它也不會將「行爲」視爲風格屬性中的禁用字符串。你可以做的其他事情可能是我和作者不知道的。我也擔心它不能正確解析HTML。它可能仍然有效,但是如果你可以愚弄解析器(比如說,將一個「>」字符放在一個屬性值中,它會認爲該標籤被關閉),那麼你可以欺騙消毒劑。 – 2012-08-17 16:00:20

+0

由於我無法編輯我的評論,我重寫了它:那麼在這種情況下,我認爲除了選擇一個庫作爲基礎並根據需要定製它之外,沒有其他辦法。這可能有點工作,但這是你真正得到你想要的東西的唯一方法。我們在工作時做了同樣的事情(可惜我不能分享這些代碼)。 – Rutix 2012-08-18 18:12:00

+0

是的,那就是我最終做的。我只是希望有更好的辦法。 – 2012-08-18 18:56:43

4

嘗試this native .NET HTML Sanitizer project。它可以根據需要理解樣式屬性(儘管它不嘗試並保留STYLE標籤,但它只是將其刪除)。

此外,它是基於白名單,而不是黑名單(它使用AngleSharp而不是CsQuery,現在已棄用)。這也是on Nuget