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