Escapar caracteres especiales

De ChuWiki

Cuando en nuestra página web ponermos un formulario en el que el navegante puede poner texto líbremente, debemos tomar ciertas precauciones.


Escapar las comillas[editar]

Si ese texto se va a guardar en base de datos, debemos "escapar" las comillas, ponerles delante el caracter \. Si no lo hacemos así, cuando construyamos la sentencia SQL para el insert o update, esas comillas pueden dar al traste con la operación.

Imagina que el navegante a introducido como texto

digo "Hola"

y esto lo metemos en PHP en una variable $comentario

cuando hagamos el SQL, pondremos algo asi

$query = 'insert into una_tabla values (...,"'.$comentario.'",...);';

que luego, se traduce a

insert into una_tabla values (...,"digo "Hola"",...);

donde las comillas que ha metido el usuario harán que de un error.

La solución consiste en poner delante de las comillas simples y dobles un caracter \, para que la sentencia SQL quede así

insert into una_tabla values (...,"digo \"Hola\"",...);

que sí es correcto.

Si está configurado para ello, PHP puede hacer esto automáticamente con cualquier cadena de texto que nos llegue de un formulario. Para saber si lo está o no haciendo, debemos llamar a la función get_magic_quotes_gpc() que devolverá 1 si ya lo hace automáticamente.

Si no lo está haciendo automáticamente, debemos hacerlo nosotros. PHP nos proporciona la función addslashes() que hace exactamente eso, añadir un \ a todas las comillas.

Entonces, el código para escapar comillas, debería ser

if (get_magic_quotes_gpc()!=1)
   $cadena=addslashes($_POST['comentario']);

donde $_POST['comentario'] es el texto que nos llega del formulario y en $cadena obtenemos el texto con las \ puestas delante de las comillas.

Eliminar tags de html[editar]

Si la cadena que ha introducido el usuario se va a presentar luego en nuestra página web, es conveniente quitarle (o al menos revisar) los posibles caracteres especiales de html que haya en dicha cadena.

Si el usuario introduce esto

digo Hola

Cuando lo mostremos, se verá Hola en negrita. Eso no es problematico. Pero si le dejamos meter esto

digo <b>Hola

A partir de ahí saldrá todo el texto en negrita, ya que se ha olvidado de cerrarlo. Y la cosa puede ser peor si además tiene mala intención y se le ocurren cosas como

digo <script type="text/javascript">puñetitas en javascript</script>

Se ejecutará el código que el haya querido.

Nuevamente PHP nos pone las cosas fáciles. La función htmlentities() coge todos los caracteres especiales de html y los reemplaza por los equivalentes para que se visualicen. Así, por ejemplo, cambia los < por & lt ;

Con esto, el usuario puede meter lo que quiera, que se verá tal cual lo meta, sin permitir "efectos especiales html".

$nuevacadena = htmlentities($cadena);

Retornos de carro[editar]

En un textarea de html el usuario puede meter muchas lineas. Las líneas se cortan automáticamente si son muy largas y otras las corta el usuario introduciendo nueva línea (retorno de carro).

Si dejamos esto así, tal cual, cuando mostremos en pantalla ese texto, saldrá todo seguido, ya que nadie convierte esos retornos de carro del usuario en tags br de html.

Una vez más, PHP nos lo da todo hecho. La función nl2br() nos hace esa conversión, cambiando los \n por <br>

$nuevacadena=nl2br($cadena);


Enlaces externos[editar]