2010-03-20 13 views
18

Tumblr y otros sitios web de blogs permiten a las personas publicar códigos incrustados de videos de youtube y de todas las redes de video.¿Cómo protegerse de XSS cuando permite que las personas publiquen códigos incrustados RAW?

pero cómo filtran solo el código del objeto flash y quitan cualquier otro html o scripts? e incluso tienen un código automatizado que le informa que este no es un código de video válido.

¿Esto se hace usando expresiones REGEX? ¿Y hay una clase de PHP para hacer eso?

Gracias

Respuesta

24

En términos generales, usando expresiones regulares no es una buena manera de tratar con HTML: HTML no es lo suficientemente regular para expresiones regulares: hay demasiadas variaciones permitidas en las normas ... Y aunque los navegadores HTML que aceptar no es válido !


En PHP, ya que su pregunta se marca como php, una gran solución que existe para filtrar la entrada del usuario es la herramienta HTMLPurifier.

Un par de cosas interesantes son:

  • Permite especificar qué etiquetas específicas se permiten
  • Para cada etiqueta, puede definir los atributos específicos que se les permite

Básicamente, la idea es mantener solo lo que especifique (lista blanca), en lugar de tratar de eliminar cosas malas usando una lista negra (que nunca será del todo completa).


Y si solo especifica una lista de etiquetas y atributos que no pueden dañar, solo se mantendrán y los riesgos de las inyecciones disminuirán mucho.


Citando a la página principal de HTMLPurifier:

Purificador HTML es una librería de filtros HTML compatible con los estándares escrito en PHP.
Purificador HTML no sólo eliminará todo el código malicioso (más conocido como XSS) con un fondo auditado, lista blanca todavía permisiva seguro, también se asegurará de que sus documentos están compatible con las normas, algo que sólo alcanzable con una amplia conocimiento de las especificaciones del W3C.

Sí, otra gran cosa es que el código que se obtiene como salida es válida.



Por supuesto, esto sólo permitirá limpiar/filtro/purificar el HTML de entrada; no le permitirá validar que el URL utilizado por el usuario sea ambos:

  • correcto; es decir, apunta a un contenido real
  • "OK" tal como lo define su sitio web; es decir, por ejemplo, hay desnudos, ...


Sobre el segundo punto, no hay mucho que uno puede hacer al respecto: la mejor solución será ya sea:

  • con un moderador acepte/rechazar los contenidos antes de que se pongan en línea
  • Ofrezca a los usuarios del sitio web una forma de marcar el contenido como inapropiado, de modo que un moderador tome medidas.

Básicamente, para comprobar el contenido en sí del video, no hay más remedio que tener un ser humano decir " bien" o "no bien".


Sobre el primer punto, sin embargo, hay esperanza: algunos servicios que alojan contenido tengan API que es posible que desee/Ser capaz de utilizar. Por ejemplo, Youtube proporciona una API, consulte Developer's Guide: PHP.

En su caso, la sección Retrieving a specific video entry parece prometedor: si envía una solicitud HTTP a una URL que tiene este aspecto:

http://gdata.youtube.com/feeds/api/videos/videoID 

(Sustitución "videoID" por el ID del vídeo, por supuesto)

Obtendrás algo de alimentación ATOM si el video es válido; e "Id. no válido" si no es

Esto podría ayudarlo a validar al menos algunos URL a los contenidos, incluso si debe desarrollar algún código específico para cada servicio de alojamiento de contenido que gusten a sus usuarios ...


Ahora, para extraer el identificador del video de su cadena HTML ...Si usted está pensando en usar expresiones regulares, usted está equivocado ;-)

La mejor solución para extraer una parte de los datos de una cadena HTML es generalmente a:

  • carga el código HTML usando un analizador DOM; DOMDocument::loadHTML es generalmente bastante útil, aquí
  • Vaya a través del documento usando los métodos DOM; o bien, dependiendo de su situación:
    • DOMDocument::getElementsByTagName, si es necesario iterar sobre todos los elementos que tienen un nombre de etiqueta específica; podría ser grande para iterar sobre todos los <object> o <embed> etiquetas, por ejemplo
    • O, si necesita algo más complejo, se puede hacer una consulta XPath, utilizando the DOMXPath class y su método DOMXPath::query.

Y el uso de DOM también permiten modificar el documento HTML usando una API estándar - lo que podría ayudar, en caso de que desee añadir algún mensaje junto al vídeo, o cualquier otra cosa como esa .

+0

'DOMDocument' sería genial si no fuera tan defectuoso y fuera compatible con' UTF-8', parece que fue creado más para 'XML' que' HTML', sugiero usar [html5lib] (https: //github.com/html5lib) en su lugar –

0

Esto nunca será seguro. Los navegadores tienen esas pequeñas funcionalidades divertidas que ayudan a las personas a mostrar el contenido de sus páginas, incluso si html está desordenado. Hay un sinfín de oportunidades para conseguir algo a través :)

cheque here para ver la punta del iceberg

Lo que hay que hacer es usar una sola entrada por sólo un enlace y entradas Adicionales para la anchura y la altura y el filtro aquellos. ENTONCES genere la etiqueta de objeto usted mismo.

Este podría estar seguro.

1

He implementado un algoritmo para esto para la empresa para la que trabajo. Funciona bien. PERO, fue bastante complicado de implementar.

Definitivamente verifica HTMLPurifier para ver si eso funciona de una manera fácil para usted. Si insiste en hacerlo de la vieja escuela de ida como lo hice, esto es los pasos básicos:

1. En primer ==> obtener de amistad con stripos()

2. Hay que hacer una función recursiva para identificar el inicio y parada de etiquetas para el widget, que incluye todas las combinaciones de <embed></embed> o <embed/> (cierre automático) o <object></object> ... o <object><params>...<embed/></object>

3. Después de esto, usted tiene que analizar todos los atributos y params .

4. Ahora, todas las etiquetas <object> deben tener etiquetas <param> como elementos secundarios. Debe analizar todos estos para obtener todos los datos que necesita para finalmente generar una nueva etiqueta incrustada o objeto. Especialmente, los params y atributos que se mantienen con, la altura, la fuente de datos son importantes.

5. Ahora, usted no sabe si los atributos están encerrados entre comillas simples o dobles, por lo que su código debe ser indulgente de esta manera. Además, no se sabe si el código es válido o está bien formado. Por lo tanto, debería ser capaz de manejar etiquetas embebidas/objeto anidadas, etiquetas incrustadas que no están encerradas correctamente, etc., etc. Como es el contenido generado por el usuario, no se puede conocer realmente ni confiar en la entrada. Verás que hay muchas combinaciones.

6. Si logra analizar el elemento embebido con todos sus atributos (o elemento de objeto y su hijo params), la lista blanca de dominios es fácil ...

Mi código terminó alrededor de 800 líneas de código, que es bastante grande, y se rellenó con métodos recursivos, encontrando etiquetas de finalización y finalización correctas, etc. Mi alghorithm también eliminó todo el texto SEO que a menudo está incluido en el código de inserción &, como enlaces atrás al sitio que contiene el widget.

Es un buen ejercicio, pero si yo en tu ... No empieces a caminar por esta carretera.

Recomendación: ¡Intenta encontrar algo listo, de código abierto!

0

La solución más simple y elegante: Allowing HTML and Preventing XSS @ shiflett.org.
Usar todo tipo de "purificador de HTML" es más que inútil. Lo siento pero no entiendo a las personas que les gusta usar estas bibliotecas infladas cuando hay una solución mucho más simple disponible.

0

Si está buscando hacer que su sitio sea "seguro" frente a las vulnerabilidades, un enfoque de lista blanca es el (único) camino a seguir. Recomendaría escaparse con seguridad de todo el contenido generado por el usuario, y solo el marcado en lista blanca que sabe que es seguro y funciona en su sitio. Esto significa no solo las etiquetas <B>, sino también las incrustaciones flash.

Por ejemplo, si desea permitir que se incruste cualquier youtube, escriba un RegEx de validación que busque el código de inserción que generan. Negarse a aceptar cualquier otro (o simplemente mostrarlo como marcado escapado). Esto es comprobable Olvida todo este análisis sin sentido.

Si también desea agregar videos de vimeo, mire el código de inserción que proporcionan y también acepte eso.

Ugh? Sé que esto parece un dolor, pero en realidad es mucho más fácil de escribir que algún algoritmo que intente detectar contenido "malo" de algún modo genérico.

Después de obtener la versión simple del algoritmo funcionando, puede volver atrás y hacerlo más agradable. Podría "provisionalmente" aceptar contenido con URLs, scripts, etc. que no pasen su lista blanca, y tener un proceso de administración para agregar expresiones regulares aprobadas a su rutina de salida de salida. De esta forma, los usuarios legítimos no se quedan afuera, pero no se expone a ataques de esta naturaleza.

Cuestiones relacionadas