Foros del Web » Programando para Internet » PHP »

Ayuda con preg_replace y expresiones regulares!

Estas en el tema de Ayuda con preg_replace y expresiones regulares! en el foro de PHP en Foros del Web. Hola a todos! Hace unos meses pedí ayuda con un asunto similar, y como la respuesta fue rápida y satisfactoria, vuelvo con más dudas. Me ...
  #1 (permalink)  
Antiguo 10/06/2009, 03:12
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Pregunta Ayuda con preg_replace y expresiones regulares!

Hola a todos!

Hace unos meses pedí ayuda con un asunto similar, y como la respuesta fue rápida y satisfactoria, vuelvo con más dudas.

Me encuentro con la necesidad de eliminar una parte de una cadena de caracteres, por el uso de HTML en mi web, que es similar a un foro donde la gente puede postear mensajes con dicho formato.

Me vendría bien recomendaciones de cómo filtrar el código HTML para que no pueda ser explotado por atacantes... Lo que hacía antes era eliminar las etiquetas <SCRIPT></SCRIPT> y su contenido, pero eso no basta... Si alguien quiere subir una imagen con posición absoluta, podría ser tan grande que taparía toda la pantalla y sería imposible de eliminar por el administrador. Solo podría hacerlo yo desde la base de datos.

El código sería el siguiente:

Código:
<img src = "imagen.jpg" alt = "imagen gigante" style = "position: absolute; left: 0px; top: 0px;" border = "0" height = "2000" width = "2000" />
Entonces utilizo el siguiente algoritmo para eliminar la parte style dentro de la etiqueta img:

preg_replace('/(<img[^>]*)style*.=*.(\'|").*(\'|")/si', '\\1', $cadena);

Le di la posibilidad de comillas simples y comillas dobles (ya que creo que style no funciona sin encomillado). La "s" por si hay salto de línea, y la "i" para que sea case insensitive.

Me da el siguiente resultado:

Código:
<img src = "imagen.jpg" alt = "imagen gigante"  />
Mi problema es que no domino todavía muy bien las expresiones regulares... Eliminó todo lo que viene después de style, incluyendo border, height y width. Y eso no debería hacerlo.

¿Cuál es el código que debo implementar realmente?

Muchas gracias!
  #2 (permalink)  
Antiguo 10/06/2009, 03:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ayuda con preg_replace y expresiones regulares!

solo quieres eliminar el estilo??

Código:
/<img([^>]*)(?:style=['"].*['"])?(.*?)\/?>/Uis
y el reemplazo sería: <img \\1\\2/>
(no la he probado, que conste)


suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 10/06/2009, 03:55
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda con preg_replace y expresiones regulares!

No funciona

Para qué sirve la "U"?

Y en el ejemplo muestro que style = ' ' (el style y el igual tienen un espacio y funcionan igual)... Porque si reemplazo style=' ', si alguien postea un código style = ' ' no lo reemplazaría... Al menos creo que es así!

Muchas gracias por ayudar!
  #4 (permalink)  
Antiguo 11/06/2009, 09:20
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Ayuda con preg_replace y expresiones regulares!

Prueba así:
Código PHP:
Ver original
  1. $texto = preg_replace('@(<img[^>]*)style=(["|\']).+?\\2@si', '\\1', $texto);
Aunque, debes tener en cuenta que aún se pueden hacer inyecciones con cualquier otra etiqueta, así como también con los eventos (onclick, onmousemove, onkeypress...)
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 11/06/2009, 09:41
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Ayuda con preg_replace y expresiones regulares!

Muchas gracias David por contestar! El "Grande" te queda chico

Funcionó perfecto!

Es verdad pueden hacer otras inyecciones pero ya me iré preparando con más filtros

Así que pueden cerrar el tema!

Saludos!
  #6 (permalink)  
Antiguo 11/06/2009, 10:53
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Ayuda con preg_replace y expresiones regulares!

¿que hace el @ al principio de preg_replace('@(<img[^>]*)style=(["|\']).+?\\2@si', '\\1', $texto);?

Edito:

ya entendi es otra forma de /
  #7 (permalink)  
Antiguo 11/06/2009, 11:13
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Ayuda con preg_replace y expresiones regulares!

Sólo para ejemplificar lo fácil que puede ser hacérselas de listo con estos filtros. Prueba con:
Código HTML:
Ver original
  1. <img style="width: 100%; height: 100%; position: absolute; top: 0; left: 0;" style="text" src="imagen.jpg" />
En mi opinión, siempre es más seguro obtener sólo lo permitido y descartar todo lo demás que tratar de filtrar todo lo no permitido.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:41.