Подтвердить что ты не робот

Как защитить себя от XSS, когда вы позволяете людям размещать коды вставки RAW?

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

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

Это делается с использованием выражений REGEX? И есть ли класс PHP для этого?

Спасибо

4b9b3361

Ответ 1

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


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

Несколько интересных вещей:

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

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


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


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

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

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



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

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


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

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

В принципе, чтобы проверить сам контент видео, выбора не так много, но человек говорит "хорошо" или "не нормально".


Однако в первую очередь есть надежда: некоторые службы, на которых размещается контент, имеют 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, если вам нужно перебрать все элементы, имеющие определенное имя тега; может быть здорово перебирать теги <object> или <embed>, например
    • Или, если вам нужно что-то более сложное, вы можете выполнить запрос XPath, используя класс DOMXPath и его a href= "http://fr2.php.net/manual/en/domxpath.query.php" rel= "noreferrer" > DOMXPath::query.

И использование DOM также позволит вам изменить HTML-документ с помощью стандартного API, что может помочь, если вы хотите добавить какое-то сообщение рядом с видео или любую другую вещь.

Ответ 3

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

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

1. Сначала из == > дружите с stripos()

2. Вы должны сделать рекурсивную функцию, чтобы идентифицировать теги запуска и остановки для виджета, который включает в себя все комбинации <embed></embed> или <embed/> (selfclosing) или <object></object>... или <object><params>...<embed/></object>

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

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

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 6

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

Ответ 7

Если вы ищете, чтобы ваш сайт был "безопасным" от уязвимостей, подход белого списка - это (только) способ перехода. Я бы порекомендовал безопасно избегать всего контента, созданного пользователем, и только белая запись, которую вы знаете, безопасна и работает на вашем сайте. Это означает не только <B> теги, но также и флэш-вложения.

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

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

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

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