Я обнаружил, что для чего-то, что я считаю довольно импортным, очень мало информации или библиотек о том, как справиться с этой проблемой.Можно ли улучшить это? Scrubbing опасных html-тегов
Я нашел это при поиске. Я действительно не знаю всех миллионов способов, которыми хакер может попытаться вставить опасные теги.
У меня есть богатый редактор 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 человек предложили белый список. Мне действительно нравится идея whitelists, но на самом деле это не так, потому что никто не может сказать мне, как это сделать на C#, и я даже не могу найти учебники для того, как это сделать в C# (в последний раз, когда я смотрел. проверьте его снова).
Как вы делаете белый список? Это просто коллекция списков?
Как вы анализируете все теги html, теги скриптов и любые другие теги?
Как только у вас есть теги, как вы определяете, какие из них разрешены? Сравните их с вашим списком? Но что происходит, если контент входит и имеет 100 тегов, и вам разрешено 50. Вы должны сравнить каждый из этих тегов на 50 допустимых тегов. Это довольно много, чтобы пройти и может быть медленным.
Как только вы обнаружили недействительный тег, как его удалить? Я действительно не хочу отклонять целый набор текстов, если один тег был признан недействительным. Я скорее удаляю и вставляю остальные.
Должен ли я использовать пакет гибкости html?
См. Редактировать ....... – chobo2