Как безопасно принимать вставленный <embed>код в PHP - PullRequest
2 голосов
/ 19 октября 2008

Я хочу разрешить пользователям вставлять <embed> и <object> фрагменты HTML (видеоплееры) через форму HTML. Код на стороне сервера - PHP. Как я могу защитить себя от вредоносного кода, JavaScript и т. Д.? Я мог бы разобрать вставленный код, но я не уверен, что мог бы объяснить все варианты. Есть ли лучший способ?

Ответы [ 3 ]

4 голосов
/ 19 октября 2008

Я не совсем уверен, какие параметры EMBED и OBJECT принимают, поскольку я никогда не имел дело с размещением медиафайлов на странице (что на самом деле шокирует), но я бы взял BB-код подойдите к нему и сделайте что-то вроде [embed url="http://www.whatever.com/myvideo.whatever" ...], а затем вы сможете разобрать URL и все остальное, убедиться, что они допустимы, и создать свой собственный тег <EMBED>.

edit: Хорошо, что-то вроде этого должно быть хорошо:

<code>$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). '
'; печать '
' . print_r($matches2, true). '
';

Будет выведено:

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, поскольку у вас будут все необходимые данные.

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

1 голос
/ 19 октября 2008

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

Белый список лучше, чем черный. Таким образом, вы могли бы вместо этого потребовать, чтобы ввод был XHTML, и проанализировать его, используя стандартный анализатор XML. Затем пройдитесь по DOM и проверьте, что каждый из элементов и атрибутов хорошо известен, и, если все в порядке, сериализуйте обратно в XHTML, который, исходя из известного DOM, не должен быть искажен. Надлежащий синтаксический анализатор XML с поддержкой Unicode также должен бесплатно отфильтровывать неприятные «слишком длинные последовательности UTF-8» (дыра в безопасности, влияющая на IE6 и более старые Opera).

Однако ... если вы разрешаете встраивать / объекты из любого домена, вы уже разрешаете полный доступ скрипта к вашей странице из внешних доменов, поэтому внедрение HTML-кода - это не ваше беспокойство. Плагины, такие как Flash, могут выполнять JavaScript без какой-либо хитрости.

Таким образом, вы должны ограничивать источник объектов заранее определенными хорошо известными доменами. И если вы уже делаете это, вероятно, проще просто позволить пользователю выбрать поставщика видео и идентификатор клипа, а затем преобразовать это в надлежащий, хорошо известный код для встраивания для этого поставщика. Например, если вы используете разметку, похожую на bbcode, традиционный способ разрешить пользователям включать клип на YouTube - это нечто [youtube] Dtzs7DSh [/ youtube].

0 голосов
/ 19 октября 2008

Вот пример вставленного кода из 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>
...