2010-01-20 1 views
1

Есть ли проблемы с тем, что я здесь делаю? Это мой первый раз, когда мы имеем дело с чем-то подобным, и я просто хочу убедиться, что я понимаю все риски и т. Д. Для разных методов.Белые списки, предотвращающие XSS с контролем ОМУ в 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. Есть ли хороший список нормальных тегов для белого списка?
+0

Этот код не будет работать для тега «IMG», так как замена «<img>» не допускает атрибут «src». – David

ответ

2

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

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

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

+0

Итак, предполагая, что я хотел что-то более надежное, что бы вы предложили для парсеров, которые вы упомянули? Может ли HTML Agility Pack справиться с этим? Нет ли что-то, что делает все это уже? – Jason

+0

Да, HTML Agility Pack - хороший выбор. После того, как вы проанализировали DOM, это довольно тривиальное упражнение для написания рекурсивная функция, которая удаляет все, но хорошо известные элементы/атрибуты из дерева DOM. Также, если вы разрешаете 'href' /' src'/etc., не забудьте проверить URL-адреса для хорошо известных схем, таких как 'http' /' https' , чтобы избежать инъекции через «javascript:» URL и тому подобное. – bobince

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

  • Нет связанных вопросов^_^