2010-01-06 46 views
5

我的C#網站允許用戶提交HTML以在網站上顯示。我想限制HTML所允許的標籤和屬性,但我無法弄清楚如何在.net中執行此操作。清除用戶HTML中的.net

我試過使用Html Agility Pack,但我沒有看到如何修改HTML,我可以看到如何瀏覽HTML並找到某些數據,但實際上生成輸出文件令我困惑。

有沒有人有一個很好的例子清理.net中的HTML?敏捷包可能是答案,但缺乏文檔。

+0

好問題。只要我允許HTML代碼被提交和顯示,這就是我的列表的頂部 - 通常我使用控件對結果進行格式化和清理(例如,ASP.NET中的www.freetextbox.com),但我應該確認結果太。 +1的問題。 – Codesleuth 2010-01-06 16:09:37

回答

2

隨着HtmlAgilityPack可以從輸入刪除不需要的標籤:

node.ParentNode.RemoveChild(node); 
+0

這就是我正在尋找的方法。謝謝。 – spaetzel 2010-01-07 20:43:31

3

您應該只接受格式良好的HTML。

然後,您可以使用LINQ to XML來解析和修改它。

您可以製作一個遞歸函數,該函數從用戶獲取一個元素,並返回一個帶有列入白名單的標記和屬性集的新元素。

例如:

//Maps allowed tags to allowed attributes for the tags. 
static readonly Dictionary<string, string[]> AllowedTags = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase) { 
    { "b", new string[0] }, 
    { "img", new string[] { "src", "alt" } }, 
    //... 
}; 
static XElement CleanElement(XElement dirtyElement) { 
    return new XElement(dirtyElem.Name, 
     dirtyElement.Elements 
      .Where(e => AllowedTags.ContainsKey(e.Name)) 
      .Select<XElement, XElement>(CleanElement) 
      .Concat(
       dirtyElement.Attributes 
        .Where(a => AllowedTags[dirtyElem.Name].Contains(a.Name, StringComparer.OrdinalIgnoreCase)) 
      ); 
} 

如果允許超鏈接,請務必禁止javascript:網址;這段代碼並沒有這樣做。

+0

+1尼斯 - 我喜歡「自釀」的方法。 – 2010-01-06 16:02:43

0

一個工具,你可以使用可關閉SourceForge上的是SGMLReader果然HTML到格式正確的XML,並允許你把它讀作一個XmlReader或將其加載到XmlDocument對象中以供進一步處理。我之前用它來分析並不總是格式正確的HTML的網頁。

0

你看看MarkdownSharp這是開源的,由這裏的人創建的?