0

De la base de datos recibo el siguiente texto:

<div onclick="alert('código inyectado');">Texto</div>

[img]http://www.hobbyconsolas.com/sites/hobbyconsolas.com/public/media/image/2015/07/503196-halo-5-guardians-nuevos-datos-campana-cooperativa.jpg[/img]

Y aquí una URL: [url]https://www.google.es/?gws_rd=ssl[/url]

Bueno pues vamos [b]a ver si esto funciona[/b] porque "todavía" no lo sé [i][u]bien[/u][/i]

Este texto lo guardo en una variable $texto. Después de pasar por htmlspecialchars() para evitar inyección de código, intento reemplazar los caracteres html por sus homólogos:

$texto = str_replace(""","\"",$texto); //para comillas
$texto = str_replace("&lt;","<",$texto); // para <
$texto = str_replace("&gt;",">",$texto); // para >

Pero no se modifica ninguno. He estado haciendo pruebas y parece ser que es por el carácter &, si lo elimino sí se modifica.

  • Y la función [strip_tags](http://php.net/manual/es/function.strip-tags.php) – Dev. Joel Jul 09 '17 at 04:34
  • ¿Cuando observas los datos **directamente** en la base de datos aparecen tal y como se muestran en tu pregunta? Me extraña que los mismos estén almacenados de esa manera... y si lo están significa que hubo un problema de codificación al momento de guardarlos, lo cual será un dolor de cabeza permanente para ti y para cualquier otro que tenga que lidiar con esos datos. Puedes revisar por niveles, [como se explica aquí](https://es.stackoverflow.com/a/59510/29967). Saludos. – A. Cedano Jul 09 '17 at 23:52
  • Hola @A.Cedano, finalmente he decidido usar htmlspecialchars() y strip_tags(), para poder controlar lo que se introducía la base de datos y ya no me da ese problema –  Jul 09 '17 at 23:56

1 Answers1

0

Intenta usar utf8_encode o utf8_decode en el string antes de intentar manipularlo, al parecer es una cadena codificada en utf8 y mostrada en ISO-8859 o viceversa. Dicho de otra forma lo que ves en pantalla no es lo que está manipulando PHP.

PHP tiene funciones multibyte, puedes encontrarlas aquí; la función que puedes usar para resolver este problema es mb_eregi_replace

Solrac
  • 1,982
  • 1
  • 7
  • 21
  • Concretamente probando con `$limpia = htmlspecialchars($limpia, ENT_QUOTES, 'UTF-8', false);` se solucionaba el problema, aunque ya no uso dicho código. –  Jul 09 '17 at 23:57