我的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