Белый список, предотвращающий XSS с контролем ОМУ в C # - PullRequest
1 голос
/ 20 января 2010

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

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

1 Ответ

2 голосов
/ 20 января 2010

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

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

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

...