Единственный способ гарантировать , что некоторая разметка HTML не содержит JavaScript, - это отфильтровать ее от всех небезопасных тегов и атрибутов HTML, чтобы предотвратить Межсайтовый скриптинг ( XSS).
Однако, как правило, не существует надежного способа явного удаления всех небезопасных элементов и атрибутов по их именам, поскольку некоторые браузеры могут интерпретировать те, о которых вы даже не знали во время разработки, и, таким образом, открыть дыру в безопасности для злоумышленников. Вот почему вам гораздо лучше использовать белый список , а не черный список . То есть разрешить только те теги HTML, которые вы уверены, безопасны, и удалить все остальные по умолчанию. Действительно, только один случайно разрешенный тег может сделать ваш сайт уязвимым для XSS.
Белый список (хороший подход)
См. Эту статью о очистке HTML , которая предлагает несколько конкретных примеров того, почему вы должны занести белый, а не черный список. Цитата с этой страницы:
Вот неполный список потенциально опасных тегов и атрибутов HTML:
script
, который может содержать вредоносный скрипт
applet
, embed
и object
, которые могут автоматически загружать и выполнять вредоносный код
meta
, который может содержать вредоносные перенаправления
onload
, onunload
и все другие атрибуты on*
, которые могут содержать вредоносный скрипт
style
, link
и атрибут style
, который может содержать вредоносный скрипт
Здесь - еще одна полезная страница, предлагающая набор тегов и атрибутов HTML, а также атрибуты CSS, которые обычно безопасно разрешать, а также рекомендуемые методы.
Чёрный список (обычно плохой подход)
Хотя многие веб-сайты в прошлом (и в настоящее время) использовали метод внесения в черный список, в этом почти никогда не возникает реальной необходимости. (Риски безопасности неизменно перевешивают потенциальные ограничения, вводимые в белый список благодаря возможностям форматирования, которые предоставляются пользователю.) Вы должны быть в курсе его недостатков.
Например, эта страница дает список того, что якобы является "всеми" тегами HTML, которые вы, возможно, захотите удалить. Просто из краткого наблюдения вы должны заметить, что он содержит очень ограниченное количество имен элементов; браузер может легко включать собственный тег, который невольно разрешает запуск сценариев на вашей странице, что, по сути, является основной проблемой в черном списке.
Наконец, я настоятельно рекомендую вам использовать HTML DOM-библиотеку (например, известный HTML Agility Pack ) для .NET, в отличие от RegEx для выполнения очистка / внесение в белый список, так как это будет значительно более надежным. (Вполне возможно создать довольно сумасшедший запутанный HTML, который может обмануть регулярные выражения! В любом случае, правильный читатель / писатель HTML делает кодирование системы намного проще.)
Надеюсь, это должно дать вам достойный обзор того, что вам нужно спроектировать, чтобы полностью (или, по крайней мере, максимально) предотвратить XSS, и как важно, чтобы санация HTML выполнялась с учетом неизвестного фактора.