2010-01-06 44 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这是开源的,由这里的人创建的?