我的C#網站允許用戶提交HTML以在網站上顯示。我想限制HTML所允許的標籤和屬性,但我無法弄清楚如何在.net中執行此操作。清除用戶HTML中的.net
我試過使用Html Agility Pack,但我沒有看到如何修改HTML,我可以看到如何瀏覽HTML並找到某些數據,但實際上生成輸出文件令我困惑。
有沒有人有一個很好的例子清理.net中的HTML?敏捷包可能是答案,但缺乏文檔。
我的C#網站允許用戶提交HTML以在網站上顯示。我想限制HTML所允許的標籤和屬性,但我無法弄清楚如何在.net中執行此操作。清除用戶HTML中的.net
我試過使用Html Agility Pack,但我沒有看到如何修改HTML,我可以看到如何瀏覽HTML並找到某些數據,但實際上生成輸出文件令我困惑。
有沒有人有一個很好的例子清理.net中的HTML?敏捷包可能是答案,但缺乏文檔。
隨着HtmlAgilityPack可以從輸入刪除不需要的標籤:
node.ParentNode.RemoveChild(node);
這就是我正在尋找的方法。謝謝。 – spaetzel 2010-01-07 20:43:31
您應該只接受格式良好的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:
網址;這段代碼並沒有這樣做。
+1尼斯 - 我喜歡「自釀」的方法。 – 2010-01-06 16:02:43
一個工具,你可以使用可關閉SourceForge上的是SGMLReader果然HTML到格式正確的XML,並允許你把它讀作一個XmlReader或將其加載到XmlDocument對象中以供進一步處理。我之前用它來分析並不總是格式正確的HTML的網頁。
我強烈建議Microsoft's Anti-XSS Library進行santizing輸入。它支持清理html。
你看看MarkdownSharp這是開源的,由這裏的人創建的?
傑夫阿特伍德張貼在重構我的代碼基於他的白名單的方式在http://refactormycode.com/codes/333-sanitize-html
我認爲StackOverflow上結合了與http://refactormycode.com/codes/360-balance-html-tags用於消毒的帖子,併爲他們準備顯示標籤平衡代碼。當然,他們使用MarkdownSharp在帖子上啓用Markdown。
好問題。只要我允許HTML代碼被提交和顯示,這就是我的列表的頂部 - 通常我使用控件對結果進行格式化和清理(例如,ASP.NET中的www.freetextbox.com),但我應該確認結果太。 +1的問題。 – Codesleuth 2010-01-06 16:09:37