2016-09-26 25 views
2

Мне нужно отобразить содержимое строки (на котором я не контролирую) на веб-странице. Все должно отображаться как за исключением определенного ограниченного количества тегов HTML (strong, em, p, br). Это должно быть честью, и я понимаю, что ее безопасность не оставляет их незатронутыми. Все остальное должно отображаться как есть.Выборочное кодирование HTML (все, кроме определенных тегов) в .NET?

Удивительно, что большинство HTML Sanitizers действительно навязчивы в том смысле, что они направлены на устранение того, что они считают «небезопасным». Почему это? Почему они не отказываются от удаления вместо удаления? Должен ли я зарезервировать для хака вдоль линий

var encoded = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode("string content"); 
var encodedWithSafeTagsReenabled = encoded.Replace("&lt;strong&gt;", "<strong>"); 

Есть ли чище и более надежный способ сделать это в .NET экосистема в 2016 году? Опять же, почитайте белый список тегов и сохраните (закодируйте, а не удалите) все остальное?

* Чтобы уточнить, это будет использоваться для размещения контента в конкретном div на веб-странице (я знаю, что кодировка должна зависящей от контекста на основе обманутого листа OWASP XSS).

+0

Большинство HTML дезинфицирующие полагаться на самом деле построения модели документа и работать с узлами, а не пытаться искажать строка. В результате недействительный HTML либо должен быть удален, либо иначе «исправлен», либо создание модели документа не удастся. –

+0

Спасибо, понял. Они создают DOM или что-то еще, но мой вопрос в том, почему они не дефолт кодирования при сбрасывании на строку в конце? Почему они должны быть навязчивыми и удалять? Что делать, если содержимое не является допустимым DOM? Я прошу их дезинформировать произвольную строку для вывода html (не проверять действительность html). – Blinky

+0

Опять же, вот как они работают *. Когда вы работаете с чем-то вроде HTML, вам либо нужно: 1) использовать регулярные выражения, которые являются дорогостоящими и подвержены ошибкам, или 2) конструировать какое-то представление в памяти, представление на основе классов для внесения изменений, а затем сгладить его обратно в строку , Большинство библиотек, которые работают с HTML, выбирают второй путь, что означает, что они должны полагаться на * стандарты * на то, как построить этот граф объектов. Это означает, что все, что не соответствует этим стандартам (недействительным), должно быть отброшено или иным образом рассматриваться. –

ответ

0

Удаление, конечно, самый безопасный вариант. Если мы будем кодировать только html, это может быть un-htmlencoded, если в другом месте есть ошибка XSS.

Например, этот JQuery скрипт:

var searchText = searchstring.text(); 
if(noResults) 
{ 
    $("div.noResults").html("no results found for <b>" + searchText + "</b>"); //boom 
} 

Есть ли чище и более надежный способ сделать это в .NET экосистема в 2016 году? Опять же, почитайте белый список тегов и сохраните (закодируйте, а не удалите) все остальное?

Вы можете сделать это с HtmlSanitizer (NuGet) библиотеки и использовать RemovingTag событие:

var sanitizer = new HtmlSanitizer(); 
sanitizer.RemovingTag += (sender, args) => 
{ 

    var tag = args.Tag; 

    args.Cancel = true; 
    tag.OuterHtml = WebUtility.HtmlEncode(tag.OuterHtml); 

};