2010-06-10 2 views
4

Я обнаружил, что для чего-то, что я считаю довольно импортным, очень мало информации или библиотек о том, как справиться с этой проблемой.Можно ли улучшить это? 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# (в последний раз, когда я смотрел. проверьте его снова).

  1. Как вы делаете белый список? Это просто коллекция списков?

  2. Как вы анализируете все теги html, теги скриптов и любые другие теги?

  3. Как только у вас есть теги, как вы определяете, какие из них разрешены? Сравните их с вашим списком? Но что происходит, если контент входит и имеет 100 тегов, и вам разрешено 50. Вы должны сравнить каждый из этих тегов на 50 допустимых тегов. Это довольно много, чтобы пройти и может быть медленным.

  4. Как только вы обнаружили недействительный тег, как его удалить? Я действительно не хочу отклонять целый набор текстов, если один тег был признан недействительным. Я скорее удаляю и вставляю остальные.

  5. Должен ли я использовать пакет гибкости html?

ответ

3

Да, я уже вижу, вы упускаете OnMouseDown, OnMouseUp, OnChange, onsubmit и т.д. Это часть того, почему следует использовать белый список для обоих тегов и атрибутов. Даже если у вас теперь есть прекрасный черный список (очень маловероятно), теги и атрибуты добавляются довольно часто.

См. Why use a whitelist for HTML sanitizing?.

+0

См. Редактировать ....... – chobo2

4

Этот код является опасным - вы должны быть . Белый список элементов, а не их черный список.

Другими словами, сделайте небольшой список тегов и атрибутов, которые вы хотите разрешить, и не пропускайте других.

EDIT: Я не знаком с пакетом гибкости 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.Опять же, я не знаю ваших фреймворков, поэтому я не могу дать вам подробностей, извините. Надеюсь, это поможет вам начать работу в правильном направлении.

+0

См. Редактировать ....... – chobo2

+0

Привет. Итак, как насчет атрибутов для тегов или классов? что произойдет, если вы разрешите ссылки, поэтому будет hi, как это будет выглядеть в списке допустимых тегов? Также вы получаете все узлы, но как только вы их проверяете, вы объединяете узлы вместе? Как сейчас, все они отделены от ссылки SelectAllNodes() – chobo2

+0

Какие рамки вы используете? Пакет гибкости html, похоже, не имеет slectAllNodes – chobo2

Смежные вопросы