gpt4 book ai didi

c# - 这可以改进吗?清除危险的 html 标签

转载 作者:搜寻专家 更新时间:2023-11-01 05:26:50 25 4
gpt4 key购买 nike

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

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

我有一个丰富的 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 敏捷包吗?

最佳答案

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

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

编辑:我不熟悉 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 替换标签。再一次,我不知道你的框架,所以我不能给你具体细节,抱歉。希望这能让您朝着正确的方向开始。

关于c# - 这可以改进吗?清除危险的 html 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3019125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com