Белый список, предотвращающий XSS с контролем WMD в C#
Вопрос
Есть ли какие-либо проблемы с тем, что я здесь делаю?Я впервые сталкиваюсь с чем-то подобным, и я просто хочу убедиться, что понимаю все риски и т.д.к разным методам.
Я использую WMD для получения пользовательского ввода, и я отображаю его с помощью буквального элемента управления.Поскольку после ввода он становится недоступным для редактирования, я буду сохранять HTML, а не Markdown,
input = Server.HTMLEncode(stringThatComesFromWMDTextArea)
А затем запустите что-то вроде следующего для тегов, которые я хочу, чтобы пользователи могли использовать.
// Unescape whitelisted tags.
string output = input.Replace("<b>", "<b>").Replace("</b>", "</b>")
.Replace("<i>", "<i>").Replace("</i>", "</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("<" + wl + ">", "<" + wl + ">").Replace("</" + wl + ">", "</" + wl + ">");
return encodedHTML;
}
- Защитит ли меня то, что я здесь делаю, от XSS?
- Есть ли какие-либо другие соображения что следует предпринять?
- Есть ли хороший список нормальных тегов для внесения в белый список?
Решение
Если ваши требования действительно настолько просты, что вы можете выполнять такие простые замены строк, то да, это ‘безопасно’ для XSS.(Тем не менее, по-прежнему возможно отправлять неправильно сформированный контент, где <i>
и <b>
являются неправильно вложенными или незакрытыми, что потенциально может испортить страницу, на которую в конечном итоге будет вставлено содержимое.)
Но этого редко бывает достаточно.Например, в настоящее время <a href="...">
или <img src="..." />
не допускаются.Если бы вы хотели разрешить эту или другую разметку со значениями атрибутов, вам пришлось бы проделать гораздо больше работы.Затем вы могли бы обратиться к нему с помощью regex , но это создает бесконечные проблемы со случайным вложением и заменой уже замененного содержимого, поскольку regex не может анализировать HTML и тому подобное.
Чтобы решить обе проблемы, обычный подход заключается в использовании синтаксического анализатора [X] [HT]ML на входных данных, затем обходите DOM, удаляя все элементы и атрибуты, кроме заведомо исправных, и, наконец, повторно сериализуйте в [X] HTML.Тогда результат гарантированно будет хорошо сформирован и содержать только безопасный контент.