【问题标题】:Clean user HTML in .net在 .net 中清理用户 HTML
【发布时间】:2011-01-02 02:48:16
【问题描述】:

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

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

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

【问题讨论】:

  • 好问题。每当我允许提交和显示 HTML 代码时,这都会在我的列表顶部 - 通常我使用为我设置格式和清理结果的控件(即 ASP.NET 中的 www.freetextbox.com),但我应该真正确认结果也。为问题 +1。

标签: c# .net asp.net html sanitization


【解决方案1】:

我强烈推荐Microsoft's Anti-XSS Library 来消毒输入。它支持清理html。

【讨论】:

    【解决方案2】:

    您应该只接受格式正确的 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;这段代码没有这样做。

    【讨论】:

      【解决方案3】:

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

      node.ParentNode.RemoveChild(node);
      

      【讨论】:

      • 这就是我一直在寻找的方法。谢谢。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2010-10-09
            • 1970-01-01
            • 2010-09-22
            • 1970-01-01
            • 2011-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-24
            相关资源
            最近更新 更多