Как безопасно принять вставленное < embed > Код в PHP

StackOverflow https://stackoverflow.com/questions/216155

  •  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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top