HTML-дезинфицирующее средство в ASP.NET MVC, которое фильтрует опасную разметку, но позволяет остальное - PullRequest
6 голосов
/ 29 декабря 2011

Я знаю, что в SO появилось много вопросов о дезинфицирующих средствах HTML, но я не знаю, делают ли они то, что я хочу, у меня небольшой беспорядок, поскольку некоторым из рекомендуемых подходов уже более 4 лет.

У меня есть страница с редактором TinyMCE.Конечно, этот редактор отправляет HTML на сервер и ожидает HTML, поэтому я создал сущность со свойством String, украшенным атрибутом [AllowHtml].Это работает хорошо.

Теперь я хочу убедиться, что никто не пытается отправить тег <script>, <img onerror=""> или любой другой способ выполнения JS, или добавить CSS, указывающий на внешние URL.

Какое наилучшее решение на данный момент?

WPL имеет HtmlSanitizationLibrary, но как я могу узнать, какие теги считаются "безопасными"?

WPL не выпустила ничего с апреля прошлого года, и это была бета-версия.Поэтому мне было интересно, активен ли этот проект?

Приветствия.

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

WPL является стандартом де-факто. Запустите строку через нее, и вы можете распечатать ее без кодировки:

@Html.Raw(Model.SomePropertyThatWasSanitizedWithWPL)
2 голосов
/ 10 февраля 2016

AntiXss / WPL теперь «с истекшим сроком эксплуатации».Найдена эта библиотека в ответ в другом месте:

HtmlSanitizer , библиотека .NET для очистки HTML-фрагментов от конструкций, которые могут привести к атакам XSS.

Сайт проекта: https://github.com/mganss/HtmlSanitizer

0 голосов
/ 08 августа 2016

Yo, вероятно, следует использовать HTML-дезинфицирующее средство на основе белого списка, которое на самом деле понимает HTML-документы.Использование регулярных выражений, как правило, не считается безопасным подходом.

Причина, по которой Microsoft AntiXss не используется, заключается в том, что невозможно применять более подробные правила, например, что делать с тегами.Это приводит к тому, что теги полностью удаляются, когда, например, имеет смысл сохранить текстовое содержимое.Кроме того, кажется, что он больше не поддерживается.

HtmlRuleSanitizer позволяет вам определить стратегию очистки, чтобы точно соответствовать ожидаемому HTML, сгенерированному вашим редактором, следующим образом:

var sanitizer = new HtmlSanitizer();
sanitizer.Tag("strong").RemoveEmpty();
sanitizer.Tag("b").Rename("strong").RemoveEmpty();
sanitizer.Tag("i").RemoveEmpty();
sanitizer.Tag("a").SetAttribute("target", "_blank")
    .SetAttribute("rel", "nofollow")
    .CheckAttribute("href", HtmlSanitizerCheckType.Url)
    .RemoveEmpty();

string cleanHtml = sanitizer.Sanitize(dirtyHtml);

Использование заранее определенной стратегии санитарии.

...