Как защитить себя от XSS, когда Вы позволяете людям отправлять НЕОБРАБОТАННЫЕ коды для встраивания?

Tumblr и другие веб-сайты блоггинга позволяют людям отправлять встроенные коды видео с YouTube и всех видео сетей.

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

Это сделано с помощью выражений REGEX? И Есть ли класс PHP, чтобы сделать это?

Спасибо

19
задан Ryan 27 March 2010 в 22:51
поделиться

7 ответов

Вообще говоря, использование регулярных выражений не является хорошим способом работы с HTML : HTML - это недостаточно регулярны для регулярных выражений: в стандартах разрешено слишком много вариаций ... И браузеры даже принимают недопустимый HTML!


В PHP, поскольку ваш вопрос помечен как php , отличным решением для фильтрации пользовательского ввода является инструмент HTMLPurifier .

Вот пара интересных вещей:

  • Он позволяет вам указать , какие конкретные теги разрешены
  • Для каждого тега вы можете определить какие конкретные атрибуты разрешены

По сути, идея состоит в том, чтобы сохранить только то, что вы указали (белый список) , вместо того, чтобы пытаться удалить плохие вещи с помощью черного списка (который никогда не будет полностью полным) .


И если вы укажете только список тегов и атрибутов, которые не могут причинить вреда, будут сохранены только они - и риски инъекций значительно снизятся.


Цитата с домашней страницы HTMLPurifier:

HTML Purifier - это соответствующая стандартам библиотека фильтров HTML, написанная на PHP.
HTML Purifier не только удалит весь вредоносный код (более известный как XSS) с помощью тщательно проверенного, безопасного, но разрешающего белого списка, но и { {1}} также обеспечит соответствие ваших документов стандартам, что возможно только при всестороннем знании спецификаций W3C.

Да, еще одна замечательная вещь заключается в том, что код, который вы получаете в качестве вывода, действителен .



Конечно, это позволит вам очистить / отфильтровать / очистить ввод HTML; он не позволит вам подтвердить, что URL-адрес, используемый пользователем, является как:

  • правильным; т.е. указывает на реальный контент
  • "ОК", как определено вашим сайтом; например, без наготы, ...


Что касается второго пункта, тут мало что можно сделать: лучшим решением будет либо:

  • Попросите модератора принять / отклонить содержимое, прежде чем оно будет помещено online
  • Предоставьте пользователям веб-сайта возможность помечать некоторый контент как неприемлемый, чтобы модератор принимал меры.

В принципе, для проверки самого содержимого видео нет особого выбора, кроме как попросить человека сказать « ок » или « не нормально ».


Что касается первого пункта, тем не менее, есть надежда: некоторые службы, содержащие контент, имеют API , которые вы, возможно, захотите / сможете использовать.

Например, Youtube предоставляет API - см. Руководство разработчика: PHP .

В вашем случае раздел Получение определенной записи о видео выглядит многообещающим: если вы отправляете HTTP-запрос на URL-адрес, который выглядит следующим образом:

http://gdata.youtube.com/feeds/api/videos/videoID

(Замена «videoID» на идентификатор видео, конечно)

Вы получите некоторый канал ATOM, если видео действительное; и «Недействительный идентификатор», если это не так

. Это может помочь вам проверить хотя бы некоторые URL-адреса содержимого - даже если вам придется разработать какой-то конкретный код для каждой возможной службы хостинга содержимого, которая нравится вашим пользователям ...


Теперь, чтобы извлечь идентификатор видео из вашей HTML-строки ... Если вы думаете об использовании регулярного выражения, вы ошибаетесь; -)

Лучшее решение для извлечения части данных из HTML-строки - обычно для:

  • загрузки HTML с помощью парсера DOM ; DOMDocument :: loadHTML обычно очень полезен, здесь
  • Просмотрите документ , используя методы DOM ; либо, в зависимости от вашей ситуации:
    • DOMDocument :: getElementsByTagName , если вам нужно перебрать все элементы с определенным именем тега; может быть полезно перебрать все теги или , например
    • . Или, если вам нужно что-то более сложное, вы можете выполнить запрос XPath, используя класс DOMXPath и его метод DOMXPath :: query .
    • А использование DOM также позволит вам изменять HTML-документ с помощью стандартного API - что может помочь, если вы хотите добавить какое-то сообщение рядом с видео или что-то в этом роде.

      25
      ответ дан 30 November 2019 в 04:16
      поделиться

      Для начала посмотрите htmlpurifier. http://htmlpurifier.org/

      2
      ответ дан 30 November 2019 в 04:16
      поделиться

      Я реализовал алгоритм для этого для компании, в которой я работаю. Работает отлично. НО это было довольно сложно реализовать.

      Я бы определенно посмотрел на HTMLPurifier, чтобы узнать, работает ли это для вас простым способом. Если вы настаиваете на том, чтобы делать это по-старому, как это делал я, вот основные шаги:

      1. Прежде всего ==> подружитесь с stripos ()

      2 . Вы должны создать рекурсивную функцию для идентификации начального и конечного тегов для виджета, которая включает все комбинации или (самозакрывающийся) или ... или ...

      3. { {1}} После этого вам нужно проанализировать все атрибуты и параметры.

      4. Теперь все теги должны иметь теги в качестве дочерних элементов. Вы должны проанализировать все это, чтобы получить все данные, необходимые для окончательного создания нового тега встраивания или объекта. Особенно важны параметры и атрибуты, которые содержат, высоту, источник данных.

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

      6. Если вам удастся разобрать внедренный элемент со всеми его атрибутами (или объектным элементом и его дочерними параметрами), внести домены в белый список будет легко ...

      Мой код оказался около 800 строк кода, что довольно много, и он был заполнен рекурсивными методами, поиском правильных стоповых и конечных тегов и т. д. Мой алгоритм также удалил весь SEO-текст, который часто включается в вставленный код вырезания и вставки, например, обратные ссылки на сайт с виджетом.

      Это хорошее упражнение, но если я там, где ты ... Не начинай идти по этой дороге.

      Рекомендация: попробуйте найти что-нибудь готовое, с открытым исходным кодом!

      1
      ответ дан 30 November 2019 в 04:16
      поделиться

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

      посмотрите здесь, чтобы увидеть вершину айсберга

      Что вам нужно сделать, так это использовать один вход для просто ссылки и дополнительные входы для ширины и высоты и отфильтровать их. ПОТОМ сгенерировать тег объекта самостоятельно.

      Это может быть безопасным.

      0
      ответ дан 30 November 2019 в 04:16
      поделиться

      Самое простое и элегантное решение: Разрешение HTML и предотвращение XSS @ shiftlett.org .
      Использование всевозможных «очистителей HTML» более чем бессмысленно. Извините, но у меня нет людей, которые хотели бы использовать эти раздутые библиотеки, когда под рукой гораздо более простое решение.

      0
      ответ дан 30 November 2019 в 04:16
      поделиться

      Если вы хотите обезопасить свой сайт от уязвимостей, используйте белый список (единственный) путь . Я бы порекомендовал безопасно избегать всего пользовательского контента, а разметка только в белых списках, которую вы знаете, безопасна и работает на вашем сайте. Это означает не только теги , но и встраивания flash.

      Например, если вы хотите разрешить встраивание любого YouTube, напишите регулярное выражение проверки, которое будет искать код встраивания, который они генерируют. Отказывайтесь принимать любые другие (или просто отображайте их как экранированную разметку). Это можно проверить. Забудьте всю эту чушь о разборе.

      Если вы также хотите добавить видео vimeo, посмотрите на код встраивания, который они предоставляют, и примите его.

      Тьфу? Я знаю, что это похоже на боль, но на самом деле это намного проще написать, чем какой-нибудь алгоритм, который пытается обнаружить «плохой» контент каким-то общим способом.

      После того, как простая версия алгоритма заработала, можно было вернуться назад и сделать ее лучше. Вы можете «временно» принимать контент с URL-адресами, сценариями и т. Д., Которые не передаются в ваш белый список, и иметь процесс администратора для добавления утвержденных регулярных выражений к вашей процедуре экранирования вывода. Таким образом, законные пользователи не остаются в стороне, но вы не открываете себя для атак подобного рода.

      0
      ответ дан 30 November 2019 в 04:16
      поделиться

      http://php.net/manual/en/function.strip-tags.php и разрешить определенные теги?

      0
      ответ дан 30 November 2019 в 04:16
      поделиться
      Другие вопросы по тегам:

      Похожие вопросы: