Фильтрация JavaScript из HTML - PullRequest
6 голосов
/ 13 мая 2009

У меня есть текстовый редактор, который передает HTML на сервер. Этот HTML затем отображается для других пользователей. Я хочу убедиться, что в этом HTML нет JavaScript. Есть ли способ сделать это?

Кроме того, я использую ASP.NET, если это помогает.

Ответы [ 6 ]

10 голосов
/ 13 мая 2009

Единственный способ гарантировать , что некоторая разметка 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 выполнялась с учетом неизвестного фактора.

4 голосов
/ 13 мая 2009

Как отметил Ли Теобальд, это очень опасный план. Вы не можете по определению создавать «безопасный» HTML путем фильтрации / внесения в черный список, поскольку пользователь может помещать в HTML то, о чем вы не думали (или которого нет даже в вашей версии браузера, но в других есть).

Единственный безопасный способ - это использование белого списка, то есть удаление всего, кроме простого текста и определенных конкретных конструкций HTML. Это случайное, что делает stackoverflow.com: -).

3 голосов
/ 03 ноября 2012

Вот как я делаю это, используя подход белого списка (Javascript и Python-код)

https://github.com/dcollien/FilterHTML

Я определяю спецификацию для подмножества разрешенного HTML, и это только то, что должно пройти через этот фильтр. Есть также несколько опций для очистки атрибутов URL, путем разрешения только определенных схем (например, http :, ftp: и т. Д.) И запрета тех, которые могут вызвать проблемы XSS / Javascript (например, javascript: или даже data:)

edit: Это не даст вам 100% безопасности из коробки для всех ситуаций, но будет использовано разумно и в сочетании с некоторыми другими приемами (такими как проверка, находятся ли URL-адреса в одном домене, и правильное содержание). типа и т. д.) это может быть то, что вам нужно

2 голосов
/ 13 мая 2009

Если вы хотите изменить html, чтобы пользователи могли видеть сам HTML-код. Сделайте замену строки для всех '<', '>', '&' и ';'. Например, «<» становится «& lt;». </p>

Если вы хотите, чтобы html работал, самый простой способ - удалить весь HTML и Javascript, а затем заменить только HTML. К сожалению, практически нет надежного способа удалить весь javascript и разрешить только HTML.

Например, вы можете разрешить изображения. Однако вы можете не знать, что вы можете сделать

<img src='evilscript.js'>

и он может запустить этот скрипт. Это становится очень небезопасно, очень быстро. Вот почему большинство сайтов, таких как Википедия и этот сайт, используют специальный язык разметки. Это значительно упрощает форматирование, но не вредоносный JavaScript.

0 голосов
/ 13 мая 2009

Вы можете проверить, как работают некоторые WYSIWYG-редакторы на основе браузера, такие как TinyMCE . Они обычно удаляют JS и, кажется, делают на нем разумную работу.

0 голосов
/ 13 мая 2009

Самое простое, что нужно сделать, это удалить теги с помощью регулярных выражений. Проблема в том, что вы можете делать множество неприятных вещей без тегов скрипта (например, вставлять хитрые изображения, иметь ссылки на другие сайты, на которых есть неприятный Javascript). Полное отключение HTML путем преобразования символов меньше / больше чем в их формы сущностей HTML (например, <) также может быть вариантом. </p>

Если вам нужно более мощное решение, в прошлом я использовал AntiSamy для очистки входящего текста, чтобы он был безопасным для просмотра.

...