【问题标题】:Can this be improved? Scrubbing of dangerous html tags这可以改进吗?清除危险的 html 标签
【发布时间】:2010-06-10 22:53:12
【问题描述】:

我发现对于我认为非常重要的东西,关于如何处理这个问题的信息或库很少。

我在搜索时发现了这个。我真的不知道黑客可以尝试插入危险标签的所有数百万种方法。

我有一个丰富的 html 编辑器,所以我需要保留不危险的标签,但去掉不好的标签。

那么这个脚本有什么遗漏吗?

它使用 html 敏捷包。

public string ScrubHTML(string html)
{
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    //Remove potentially harmful elements
    HtmlNodeCollection nc = doc.DocumentNode.SelectNodes("//script|//link|//iframe|//frameset|//frame|//applet|//object|//embed");
    if (nc != null)
    {
        foreach (HtmlNode node in nc)
        {
            node.ParentNode.RemoveChild(node, false);

        }
    }

    //remove hrefs to java/j/vbscript URLs
    nc = doc.DocumentNode.SelectNodes("//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]");
    if (nc != null)
    {

        foreach (HtmlNode node in nc)
        {
            node.SetAttributeValue("href", "#");
        }
    }


    //remove img with refs to java/j/vbscript URLs
    nc = doc.DocumentNode.SelectNodes("//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]");
    if (nc != null)
    {
        foreach (HtmlNode node in nc)
        {
            node.SetAttributeValue("src", "#");
        }
    }

    //remove on<Event> handlers from all tags
    nc = doc.DocumentNode.SelectNodes("//*[@onclick or @onmouseover or @onfocus or @onblur or @onmouseout or @ondoubleclick or @onload or @onunload]");
    if (nc != null)
    {
        foreach (HtmlNode node in nc)
        {
            node.Attributes.Remove("onFocus");
            node.Attributes.Remove("onBlur");
            node.Attributes.Remove("onClick");
            node.Attributes.Remove("onMouseOver");
            node.Attributes.Remove("onMouseOut");
            node.Attributes.Remove("onDoubleClick");
            node.Attributes.Remove("onLoad");
            node.Attributes.Remove("onUnload");
        }
    }

    // remove any style attributes that contain the word expression (IE evaluates this as script)
    nc = doc.DocumentNode.SelectNodes("//*[contains(translate(@style, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'expression')]");
    if (nc != null)
    {
        foreach (HtmlNode node in nc)
        {
            node.Attributes.Remove("stYle");
        }
    }

    return doc.DocumentNode.WriteTo();
} 

编辑

2 人建议列入白名单。我实际上喜欢白名单的想法,但从未真正做到过,因为没有人能真正告诉我如何在 C# 中做到这一点,而且我什至无法真正找到如何在 C# 中做到这一点的教程(我最后一次查看。我会再次检查)。

  1. 如何制作白名单?它只是一个列表集合吗?

  2. 你如何实际解析出所有的 html 标签、脚本标签和所有其他标签?

  3. 一旦你有了标签,你如何确定哪些是允许的?将它们与您的列表集合进行比较?但是,如果内容进入并且有 100 个标签并且您有 50 个允许,会发生什么情况。您必须将这 100 个标签中的每一个与 50 个允许的标签进行比较。这是相当多的过程,可能会很慢。

  4. 一旦你发现一个无效标签,你如何删除它?如果发现一个标签无效,我真的不想拒绝一整套文本。我宁愿删除并插入其余部分。

  5. 我应该使用 html 敏捷包吗?

【问题讨论】:

    标签: c# .net javascript security


    【解决方案1】:

    该代码很危险——您应该将元素列入白名单,而不是将它们列入黑名单。

    换句话说,列出你想要允许的标签和属性,不要让任何其他人通过。

    编辑:我不熟悉 HTML 敏捷包,但我看不出它为什么不适用。由于我不知道框架,我会给你伪代码你需要做什么。

    doc.LoadHtml(html);
    
    var validTags = new List<string>(new string[] {"b", "i", "u", "strong", "em"});
    
    var nodes = doc.DocumentNode.SelectAllNodes();
    foreach(HtmlNode node in nodes)
        if(!validTags.Contains(node.Tag.ToLower()))
            node.Parent.ReplaceNode(node, node.InnerHtml);
    

    基本上,对于每个标签,如果它不包含在白名单中,只需将标签替换为其内部 HTML。再说一次,我不知道你的框架,所以我不能给你具体的信息,抱歉。希望这能让您朝着正确的方向开始。

    【讨论】:

    • 嗨。那么标签或类的属性呢?如果您允许链接会发生什么,所以它会是 hi 在有效标签列表中的外观如何?你也得到了所有节点,但是一旦你把它们检查出来,你会把节点重新组合在一起吗?就像现在它们都与 SelectAllNodes() 的链接分开
    • 你使用什么框架? Html 敏捷包似乎没有 slectAllNodes
    【解决方案2】:

    是的,我已经看到您缺少 onmousedown、onmouseup、onchange、onsubmit 等。这就是为什么应该对标签和属性都使用白名单的部分原因。即使您现在有一个完美的黑名单(不太可能),标签和属性也会经常添加。

    Why use a whitelist for HTML sanitizing?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2011-02-27
      • 1970-01-01
      • 2016-05-22
      • 2012-11-19
      • 2011-12-31
      相关资源
      最近更新 更多