tutorial site script reflected qué hacer definición cross consiste como caracteristicas ataque php regex

php - reflected - en qué consiste el ataque cross site scripting xss)?



¿Cómo protegerse de XSS cuando permite que las personas publiquen códigos de inserción RAW? (7)

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.

¿Pero cómo filtran solo el código objeto flash y eliminan 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.

¿Se hace esto usando expresiones REGEX? ¿Y hay una clase de PHP para hacer eso?

Gracias


Echa un vistazo a htmlpurifier para comenzar. HTMLPurifier


En términos generales, usar expresiones regulares no es una buena manera de lidiar con HTML : HTML no es lo suficientemente regular para expresiones regulares: hay demasiadas variaciones permitidas en los estándares ... ¡Y los navegadores incluso aceptan HTML que no es válido!


En PHP, como su pregunta está etiquetada como php , una gran solución que existe para filtrar las entradas del usuario es la herramienta HTMLPurifier .

Un par de cosas interesantes son:

  • Te permite especificar qué etiquetas específicas están permitidas
  • Para cada etiqueta, puede definir qué atributos específicos están permitidos

Básicamente, la idea es mantener solo lo que especifique (lista blanca) , en lugar de tratar de eliminar las cosas malas utilizando una lista negra (que nunca estará completamente completa) .


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


Citando la página de inicio de HTMLPurifier:

HTML Purifier es una biblioteca de filtros HTML compatible con los estándares escrita en PHP.
HTML Purifier no solo eliminará todo el código malicioso (mejor conocido como XSS) con una lista blanca bien auditada, segura pero permisiva, sino que también se asegurará de que sus documentos cumplan con los estándares, algo que solo se puede lograr con un conocimiento completo de las especificaciones de W3C.

Sí, otra gran cosa es que el código que obtienes como salida es válido .


Por supuesto, esto solo le permitirá limpiar / filtrar / purificar la entrada HTML; no le permitirá validar que la URL utilizada por el usuario es:

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


Sobre el segundo punto, no hay mucho que se pueda hacer al respecto: la mejor solución será:

  • Haga que un moderador acepte / rechace los contenidos antes de ponerlos en línea.
  • Ofrezca a los usuarios del sitio web una forma de marcar algún contenido como inadecuado, de modo que un moderador tome medidas.

Básicamente, para verificar el contenido del video, no hay mucha opción, pero un ser humano dice " ok " o " no ok ".


Sin embargo, sobre el primer punto, hay esperanza: algunos servicios que alojan contenido tienen API que es posible que desee o pueda usar.

Por ejemplo, Youtube proporciona una API; consulte la Guía del desarrollador: PHP .

En su caso, la sección Recuperar una entrada de video específica parece prometedora: si envía una solicitud HTTP a una URL que se parece a esto:

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

(Sustituyendo "videoID" por el ID del video, por supuesto)

Obtendrás algo de ATOM si el video es válido; y "Id. inválida" si no lo es

Esto podría ayudarlo a validar al menos alguna URL de contenido, incluso si tendrá que desarrollar algún código específico para cada servicio de alojamiento de contenido posible que les guste a sus usuarios ...


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

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

  • Cargue el HTML usando un analizador DOM ; DOMDocument::loadHTML es generalmente muy útil, aquí
  • Ir a través del documento utilizando métodos DOM ; cualquiera, dependiendo de su situación:
    • DOMDocument::getElementsByTagName , si necesita iterar sobre todos los elementos que tienen un nombre de etiqueta específico; podría ser bueno iterar sobre todas las etiquetas <object> o <embed> , por ejemplo
    • O, si necesita algo más complejo, podría hacer una consulta XPath, utilizando la clase DOMXPath y su método DOMXPath::query .

Y el uso de DOM también le permitirá modificar el documento HTML utilizando una API estándar, lo que podría ayudar, en caso de que desee agregar algún mensaje junto al video, o cualquier otra cosa así.


Esto nunca será seguro. Los navegadores tienen esas pequeñas y divertidas funcionalidades que ayudan a las personas a mostrar el contenido de sus páginas, incluso si el HTML es complicado. Hay infinitas oportunidades para pasar algo :)

Consulta here para ver la punta del iceberg.

Lo que debe hacer es usar una sola entrada para un enlace y entradas adicionales para el ancho y la altura y filtrarlas. ENTONCES genere la etiqueta del objeto usted mismo.

Esto podría ser seguro.


He implementado un algoritmo para esto para la compañía para la que trabajo. Funciona bien PERO, fue bastante complicado de implementar.

Definitivamente me gustaría ver HTMLPurifier para ver si eso funciona de una manera fácil para ti. Si insistes en hacerlo de la manera tradicional como lo hice yo, estos son los pasos básicos:

1. Primero de ==> ser amigable con stripos()

2. Debe realizar una función recursiva para identificar las etiquetas de inicio y detención del widget, que incluyen todas las combinaciones de <embed></embed> o <embed/> (autocierre) o <object></object> .. . o <object><params>...<embed/></object>

3. Después de esto, tienes que analizar todos los atributos y parámetros.

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 generar finalmente una nueva inserción o etiqueta de objeto. Especialmente los parámetros y atributos que se sostienen con, altura, fuente de datos son importantes.

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

6. Si logra analizar el elemento incrustado con todos sus atributos (o el elemento objeto y sus parámetros secundarios), la lista blanca de dominios es fácil ...

Mi código terminó con aproximadamente 800 líneas de código, que es bastante grande, y se llenó con métodos recursivos, encontrando las etiquetas correctas de parada y final, etc. Mi algoritmo también eliminó todo el texto SEO que a menudo se incluye en la inserción de cortar y pegar -código, como enlaces al sitio que contiene el widget.

Es un buen ejercicio, pero si estoy donde ... No empiece a caminar por este camino.

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


La solución más simple y elegante: permitir HTML y prevenir XSS @ shiflett.org.
Usar todo tipo de "purificador HTML" es más que inútil. Lo siento, pero no entiendo a la gente que le gusta usar estas bibliotecas abultadas cuando hay una solución mucho más simple a la mano.


Si está buscando hacer que su sitio esté "a salvo" de vulnerabilidades, un enfoque de lista blanca es el (único) camino a seguir . Recomendaría escapar de forma segura a todo el contenido generado por el usuario, y el marcado de la lista blanca solo es seguro y funciona en su sitio. Esto significa no solo las etiquetas <B>, sino también las incrustaciones de 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. Se niega a aceptar cualquier otro (o simplemente lo muestra como marca de escape). Esto es comprobable. Olvídate de todas estas tonterías analizando.

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 un algoritmo que intenta detectar contenido "malo" de alguna manera genérica.

Después de hacer funcionar la versión simple del algoritmo, podría regresar y hacerlo más agradable. Usted podría "provisionalmente" aceptar contenido con URL, scripts, etc. que no pasan su lista blanca, y tener un proceso de administración para agregar expresiones regulares aprobadas a su rutina de escape de salida. De esta manera, los usuarios legítimos no se quedan afuera en el frío, pero no te abres a ataques de esta naturaleza.