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

StackOverflow https://stackoverflow.com/questions/2104520

Вопрос

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

Я использую 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. Есть ли хороший список нормальных тегов для внесения в белый список?
Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top