5

我的 C# 站点允许用户提交要在站点上显示的 HTML。我想限制 HTML 允许的标签和属性,但无法弄清楚如何在 .net 中执行此操作。

我试过使用Html Agility Pack,但我看不到如何修改 HTML,我可以看到如何浏览 HTML 并找到某些数据,但实际上生成输出文件让我感到困惑。

有没有人有一个在.net 中清理 HTML 的好例子?敏捷包可能是答案,但缺少文档。

4

6 回答 6

4

我强烈推荐Microsoft 的 Anti-XSS Library来处理输入。它支持清理html。

于 2010-01-06T15:56:14.790 回答
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:url;这段代码不这样做。

于 2010-01-06T15:50:21.047 回答
2

使用 HtmlAgilityPack 您可以从输入中删除不需要的标签:

node.ParentNode.RemoveChild(node);
于 2010-01-06T15:52:57.920 回答
0

您可以在 SourceForge 中使用的工具是SGMLReader,它将 HTML 转换为格式正确的 XML,并允许您将其作为 XmlReader 读取或将其加载到 XmlDocument 对象中以进行进一步处理。我以前用它来解析不总是格式正确的 HTML 的网页。

于 2010-01-06T15:54:45.590 回答
0

你看过MarkdownSharp吗,它是开源的,由这里的人创建?

于 2010-01-06T16:01:42.377 回答
0

Jeff Atwood 在http://refactormycode.com/codes/333-sanitize-html上发布了他关于重构我的代码的基于白名单的方法

我相信 StackOverflow 将其与http://refactormycode.com/codes/360-balance-html-tags上的标签平衡代码相结合,用于清理帖子并准备显示。而且,当然,他们使用 MarkdownSharp 在帖子上启用 Markdown。

于 2011-01-04T18:44:21.103 回答