Как безопасно принять вставленное < embed > Код в PHP
-
03-07-2019 - |
Вопрос
Я хочу разрешить пользователям вставлять < embed >
и < object >
HTML-фрагменты (проигрыватели видео) через HTML-форму. Код на стороне сервера - PHP. Как я могу защитить себя от вредоносного кода, JavaScript и т. Д.? Я мог бы разобрать вставленный код, но я не уверен, что мог бы объяснить все варианты. Есть ли лучший способ?
Решение
Я не совсем уверен, какие параметры принимают EMBED
и OBJECT
, поскольку я никогда не имел дело с размещением медиафайлов на странице (что на самом деле шокирует подумайте о), но я бы использовал подход BB Code и сделал бы что-то вроде [embed url = " http: //www.whever.com/myvideo.whwhat" ...]
, а затем вы можете проанализировать URL-адрес и все остальное, убедиться, что они допустимы, и создать свой собственный тег < EMBED >
.
edit: Хорошо, что-то вроде этого должно быть хорошо:
$youtube = '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param> </param><embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>';
$blip = '<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>';
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $youtube, $matches1);
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $blip, $matches2);
print '<pre>' . print_r($matches1, true). '</pre>';
print '<pre>' . print_r($matches2, true). '</pre>';
Это выведет:
Array
(
[0] => Array
(
[0] => width="425"
[1] => height="344"
[2] => name="movie"
[3] => value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
[4] => src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
[5] => type="application/x-shockwave-flash"
[6] => allowfullscreen="true"
[7] => width="425"
[8] => height="344"
)
[1] => Array
(
[0] => width
[1] => height
[2] => name
[3] => value
[4] => src
[5] => type
[6] => allowfullscreen
[7] => width
[8] => height
)
[2] => Array
(
[0] => 425
[1] => 344
[2] => movie
[3] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
[4] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
[5] => application/x-shockwave-flash
[6] => true
[7] => 425
[8] => 344
)
)
Array
(
[0] => Array
(
[0] => src="http://blip.tv/play/AZ_iEoaIfA"
[1] => type="application/x-shockwave-flash"
[2] => width="640"
[3] => height="510"
[4] => allowscriptaccess="always"
[5] => allowfullscreen="true"
)
[1] => Array
(
[0] => src
[1] => type
[2] => width
[3] => height
[4] => allowscriptaccess
[5] => allowfullscreen
)
[2] => Array
(
[0] => http://blip.tv/play/AZ_iEoaIfA
[1] => application/x-shockwave-flash
[2] => 640
[3] => 510
[4] => always
[5] => true
)
)
С этого момента все довольно просто. Для таких вещей, как ширина / высота, вы можете проверить их с помощью is_numeric
и с помощью В остальном вы можете запустить значения через htmlentities
и создать свой собственный тег < embed >
из информации. Я почти уверен, что это будет безопасно. Вы даже можете создать полноценный < object >
такой, как YouTube (который, как я предполагаю, работает в других местах) со ссылками из blip.tv, поскольку у вас будут все необходимые данные.
Я уверен, что вы можете увидеть некоторые причуды со ссылками с других сайтов для обмена видео, но, надеюсь, это поможет вам начать работу. Удачи.
Другие советы
Ваши шансы надежного обнаружения вредоносного кода путем сканирования введенного HTML-кода практически равны нулю. Существует так много возможных способов внедрения скрипта (включая искаженный HTML-код для браузера), и вы не сможете выбрать их все. Если крупные провайдеры веб-почты по-прежнему после многих лет находят новые эксплойты, у вас нет шансов сделать это.
Белый список лучше, чем черный. Таким образом, вы могли бы вместо этого потребовать, чтобы ввод был XHTML, и проанализировать его с помощью стандартного синтаксического анализатора XML. Затем пройдитесь по DOM и проверьте, что каждый из элементов и атрибутов хорошо известен, и, если все в порядке, сериализуйте обратно в XHTML, который, исходя из известного DOM, не должен быть искажен. Правильный синтаксический анализатор XML с поддержкой Unicode должен также отфильтровывать неприятные «слишком длинные последовательности UTF-8» (дыра в безопасности, затрагивающая IE6 и более старые Opera).
Однако ... если вы разрешаете встраивать / объекты из любого домена, вы уже разрешаете полный доступ сценариев к вашей странице из внешних доменов, поэтому внедрение HTML-кода - это не ваше беспокойство. Плагины, такие как Flash, могут выполнять JavaScript без какой-либо хитрости.
Таким образом, вы должны ограничивать источник объектов заранее определенными хорошо известными доменами. И если вы уже делаете это, вероятно, проще просто позволить пользователю выбрать поставщика видео и идентификатор клипа, а затем преобразовать это в надлежащий, хорошо известный код для встраивания для этого поставщика. Например, если вы используете разметку, похожую на bbcode, традиционным способом разрешить пользователям включать клип на YouTube было бы что-то [youtube] Dtzs7DSh [/ youtube].
Вот пример вставленного кода из blip.tv:
<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"
width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>
Вот пример того, что вы можете получить с YouTube:
<object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param>
<param name="allowFullScreen" value="true"></param>
<embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
type="application/x-shockwave-flash" allowfullscreen="true"
width="425" height="344"></embed>
</object>