Внесение в белый список, предотвращение XSS с контролем WMD в C #

Есть ли проблемы с тем, что я здесь делаю? Я впервые сталкиваюсь с чем-то подобным, и я просто хочу убедиться, что понимаю все риски и т. Д., Связанные с различными методами.

Я использую WMD для ввода данных пользователем, и я показываю его с буквальным контролем. Поскольку после ввода его нельзя редактировать, я буду хранить HTML, а не Markdown,

input = Server.HTMLEncode(stringThatComesFromWMDTextArea)

А затем запустите что-то вроде следующего для тегов, которые я хочу, чтобы пользователи могли использовать.

// Unescape whitelisted tags.
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>")
                     .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>");

Изменить Вот чем я сейчас занимаюсь:

 public static string EncodeAndWhitelist(string html)
 {
     string[] whiteList = { "b", "i", "strong", "img", "ul", "li" };
     string encodedHTML = HttpUtility.HtmlEncode(html);
     foreach (string wl in whiteList)
         encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">");
     return encodedHTML;
 }
  1. Будет ли то, что я здесь делаю, защитить от XSS?
  2. Есть ли еще какие-то соображения, которые следует учесть?
  3. Есть ли хороший список нормальных тегов для внесения в белый список?

person Jason    schedule 20.01.2010    source источник
comment
Этот код не будет работать для тега IMG, поскольку замена img не позволяет использовать атрибут src.   -  person David    schedule 20.01.2010


Ответы (1)


Если ваши требования действительно настолько просты, что вы можете выполнять такие простые замены строк, тогда да, это «безопасно» против XSS. (Тем не менее, по-прежнему можно отправлять плохо сформированный контент, где <i> и <b> неправильно вложены или незакрыты, что потенциально может испортить страницу, на которую в конечном итоге вставлен контент.)

Но этого бывает редко. Например, в настоящее время <a href="..."> или <img src="..." /> не разрешены. Если вы хотите разрешить ту или иную разметку со значениями атрибутов, у вас будет гораздо больше работы. Затем вы можете подойти к нему с помощью регулярного выражения, но это создает бесконечные проблемы со случайным вложением и заменой уже замененного содержимого, поскольку регулярное выражение не может анализировать HTML и тому подобное.

Для решения обеих проблем обычный подход заключается в использовании на входе парсера ML [X] [HT], затем обходе DOM, удаляющем все, кроме заведомо исправных элементов и атрибутов, и, наконец, повторная сериализация в [X] HTML. В этом случае гарантируется, что результат будет правильно сформирован и будет содержать только безопасный контент.

person bobince    schedule 20.01.2010
comment
Итак, предполагая, что мне нужно что-то более надежное, что бы вы посоветовали для упомянутых вами синтаксических анализаторов? Может ли HTML Agility Pack справиться с этим? Разве не существует того, что уже делает все это? - person Jason; 20.01.2010
comment
Да, HTML Agility Pack - хороший выбор. После того, как вы проанализировали DOM, сравнительно тривиальное упражнение - написать рекурсивную функцию, которая удаляет все элементы / атрибуты, кроме заведомо исправных, из дерева DOM. Также, если вы разрешаете _1 _ / _ 2_ / и т. Д., Не забудьте проверить URL-адреса на наличие заведомо исправных схем, таких как _3 _ / _ 4_, чтобы избежать внедрения через javascript: URL-адреса и т.п. - person bobince; 20.01.2010