Pregunta

Quiero permitir que los usuarios peguen < incrustar > y < object > fragmentos HTML (reproductores de video) a través de un formulario HTML. El código del lado del servidor es PHP. ¿Cómo puedo protegerme contra el código pegado malicioso, JavaScript, etc.? Podría analizar el código pegado, pero no estoy seguro de poder explicar todas las variaciones. ¿Hay una mejor manera?

¿Fue útil?

Solución

No estoy realmente seguro de qué parámetros EMBED y OBJECT toman, ya que nunca he tratado de poner los medios en una página (lo que en realidad es un poco impactante para piénselo, pero me gustaría tener un enfoque de código BB y hacer algo como [incrustar url = "http: //www.whatever.com/myvideo.whatever" ...] y luego puede analizar la URL y cualquier otra cosa, asegúrese de que sean legítimas y cree su propia etiqueta < EMBED > .

editar: Muy bien, algo como esto debería estar bien:

$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>';

Esto dará como resultado:

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
    )
)

A partir de entonces es bastante sencillo. Para cosas como ancho / alto, puede verificarlas con is_numeric y con la descanse, puede ejecutar los valores a través de htmlentities y construir su propio < incrustar > a partir de la información. Estoy bastante seguro de que esto sería seguro. Incluso puedes hacer que el < object > completo como YouTube (que supongo que funciona en más lugares) con enlaces desde blip.tv, ya que tendrías todos los datos necesarios.

Estoy seguro de que puedes ver algunas peculiaridades con enlaces de otros sitios web para compartir videos, pero espero que esto te ayude a comenzar. Buena suerte.

Otros consejos

Sus posibilidades de detectar un código malicioso de manera confiable al escanear el HTML ingresado son casi nulas. Hay tantas formas posibles de inyectar secuencias de comandos (incluido el HTML con formato incorrecto específico del navegador) que no podrá seleccionarlas todas. Si los grandes proveedores de correo web aún están buscando nuevos exploits después de años, no hay posibilidad de que puedas hacerlo.

La lista blanca es mejor que la lista negra. Por lo tanto, podría requerir que la entrada sea XHTML y analizarla utilizando un analizador XML estándar. Luego, recorra el DOM y compruebe que cada uno de los elementos y atributos es bueno, y si todo está bien, vuelva a XHTML, que, proveniente de un DOM en buen estado, no debe tener un formato incorrecto. Un analizador XML adecuado con compatibilidad con Unicode también debería filtrar "secuencias UTF-8 desagradables" desagradables (un agujero de seguridad que afecta a IE6 y óperas más antiguas) de forma gratuita.

Sin embargo ... si permites incrustar / objetos desde cualquier dominio, ya estás permitiendo el acceso completo a tu página desde dominios externos, por lo que la inyección de HTML es la menor de tus preocupaciones. Es probable que los complementos como Flash puedan ejecutar JavaScript sin que sea necesario ningún tipo de engaño.

Por lo tanto, debe limitar el origen de los objetos a dominios predeterminados de bien conocido. Y si ya lo está haciendo, es probable que sea más fácil simplemente permitir que el usuario elija un proveedor de video y una ID de clip, y luego convertirlo en el código de integración adecuado y de buena reputación para ese proveedor. Por ejemplo, si está utilizando un marcado similar a bbcode, la forma tradicional de permitir que los usuarios incluyan un clip de YouTube sería algo [youtube] Dtzs7DSh [/ youtube].

Aquí hay un ejemplo de código pegado de blip.tv:

<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>

Este es un ejemplo de lo que podría obtener de 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top