Это вполне разумный подход. Для типичных приложений этого будет вполне достаточно.
Самая хитрая часть белого HTML-списка - это атрибут style
и embed
/ object
. Существуют законные причины, по которым кто-то может захотеть поместить стили CSS в ненадежный блок форматированного текста или, скажем, встроенное видео YouTube. Эта проблема чаще всего встречается в каналах. Вы не можете доверять произвольному блоку текста, содержащемуся в записи фида, но вы не хотите удалять, например, подсветку синтаксиса CSS или флэш-видео, потому что это в корне изменит контент и может привести в замешательство любого, кто его читает. Поскольку CSS может содержать опасные вещи, такие как поведение в IE, вам, возможно, придется анализировать CSS, если вы решите оставить атрибут style
. А с embed
/ object
вам может понадобиться внести в белый список имена хостов.
Addenda:
В наихудших сценариях HTML, который скрывает все, что видно, может привести к очень плохому восприятию пользователя. Гораздо лучше использовать что-то вроде одного из HTML5-парсеров, чтобы пройти через DOM с вашим белым списком. Это намного более гибко с точки зрения того, как вы представляете очищенный вывод своим пользователям. Вы даже можете делать такие вещи, как:
<code><div class="sanitized">
<div class="notice">
This was sanitized for security reasons.
</div>
<div class="raw"><pre>
<script>alert("XSS!");</script>
Затем скройте содержимое .raw
с помощью CSS и используйте jQuery для привязки обработчика щелчка к .sanitized
div
, который переключается между .raw
и .notice
:
CSS:
.raw {
display: none;
}
JQuery:
$('.sanitized').click(function() {
$(this).find('.notice').toggle();
$(this).find('.sanitized').toggle();
});