Secuencias de escape y escaping en PHP.

Secuencias de escape y escaping en PHP.

Existen caracteres que no tienen representacion grafica , que son denominados caracteres de control. Con el fin de poder representarlos en el código fuente, se recurrió al artificio de representarlos utilizando una barra invertida (\) seguida de otra serie de caracteres.

Secuencias de escape

Las secuencias de caracteres en las que el primero es la barra invertida, se denominaron secuencias de escape y aunque originariamente se utilizaron para la representación de los caracteres de control, por extensión pueden representarse de este modo todos los códigos ASCII. Además se dispone de algunos símbolos predefinidos para los caracteres más frecuentes. Por ejemplo, \n se utiliza para representar el carácter nueva línea (decimal 10). Los símbolos utilizados se muestran en la tabla adjunta.
Por ejemplo para el lenguaje C se tiene estas secuencias de escape.

Secuencia Valor Símbolo Descripción
\a 0x07 BEL Sonido audible (bell)
\b 0x08 BS Retroceso (backspace)
\f 0x0C FF Salto de formato (formfeed)
\n 0x0A LF Saltar una línea (linefeed)
\r 0x0D CR Retorno de carro (carriage return)
\t 0x09 HT Tabulación horizontal (H Tab)
\v 0x0B VT Tabulación vertical (V Tab)
\ \ 0x5c \ Barra invertida (backslash)
\’ 0x27 Apóstrofo (comilla simple)
\” 0x22 Doble comilla
\? 0x3F ? Interrogación
\O cualquiera cualquiera O = cadena de hasta tres dígitos octales
\xH cualquiera cualquiera H = cadena de dígitos hexadecimales
\XH cualquiera cualquiera H = cadena de dígitos hexadecimales

Fuente : http://www.zator.com/Cpp/E_Ce.htm

Escaping

Se llama escaping a la adicion de un caracter de escape (usualmente un backslash) a un caracter o siendo mas genericos a una secuencia de caracteres para poder representarlos graficamente.

Generalmente cuando se aplica a un string , o un valor que venga por GET, POST, desde COOKIE o de ENV el objetivo es hacer que un caracter o una secuencia de ellos que podrian ser considerados de “control” sean convertidos en caracteres sin significado para un funcion que la use, es decir son tomados solamente como DATOS .

Cada lenguaje permite usar secuencias de escape para poder representar gráficamente los caracteres de control o todos los caracteres que use el lenguaje. De hecho cada lenguaje tendra una tabla parecida a la que tiene el lenguaje C con variaciones inherentes al lenguaje.

Java tiene secuencias de escape.
Una BD que implemente SQL tiene secuencias de escape.
Javascript tiene tiene secuencias de escape.
HTML tiene secuencias de escape.
PHP tiene secuencias de escape.
Los lenguajes .NET tienen secuencias de escape.

El backslash como caracter de escape ha sido usando en los primeros lenguajes que se crearon como el lenguaje C y por costumbre ha sido adoptado de facto por los nuevos lenguajes de programación como Java, el SQL en MySQL, JavaScript, PHP, los lenguajes .NET y varios más.

A su vez cada lenguaje tiene funciones que aplican el escaping adecuado a su entorno de programacion.
Funciones de escape
mysql_real_escape_string() de mysql y disponible para usar en PHP.
addslashes() de PHP.
escape() de Javascript.

En PHP las secuencias de escape como el doble backslash, el new Line, el carriage return solo tienen significado cuando son escritos a archivos o visualizados en un browser (aunque algunos no se muestren debido a los White Spaces de HTML como se vera en Mi pagina no sale como yo la codifico ) tal como indica cuando se refiere a los caracteres de escape de PHP Leon Atkinson en su libro Core PHP Programming, Third Edition.

Alternativas de uso de escaping

Con la directiva magic_quotes_gpc

Esta directiva esta desfasada a partir de la versión 5.4 de PHP , inicialmente se creo para facilitar el envío de datos desde un formulario a sentencias SQL.
Pero con el tiempo y debido a la aparición de técnicas que hacian uso de la falta de validación que garantice entradas seguras desde el usuario, ha sido reemplazada por otras formas de escaping, desfasando esta directiva.

Si PHP tiene en su configuracion (en Php.ini) activada esta directiva se hace una adicion de un backslash por a estos caracteres (con las mismas reglas que la funcion addslashes) :
– comilla simple.
– doble comilla.
– backslash.
– caracter nulo de ASCII (el valor ASCII cero).

Cuando se recibe datos externos (provenientes de GET,POST, COOKIE o ENV) esta directiva incrementa un poco el nivel de seguridad (contra ataques de XSS e inyecciones SQL por ejemplo) pero con la desventaja de hacer el codigo mas complejo.

Esta complejidad del codigo sera necesaria para aplicar la adicion o el retiro de los backslash en cada variable proveniente de $_GET[], $_POST[], $_COOKIE[] y $_ENV[].

Ademas al funcionar de la misma forma que addslashes, no asegura que se haga una correcta evaluacion de secuencias de escape segun cada BD, porque puede ser vulnerable a ataques que esten orientados a los character sets de dicha BD.
Que pasa si se usa magic_quotes_gpc activada.
* No tendremos que usar alguna funcion de scaping al recibir una peticion del browser.

Que pasa si NO se usa magic_quotes_gpc activada.
* Tendremos que usar alguna funcion de escaping al recibir una peticion del browser.

Una caracteristica del uso de esta forma de escaping es que facilita la portabilidad , pero teniendo en cuenta que su nivel de seguridad no es el adecuado.
Si tengo codigo corriendo en un servidor en donde esta directiva este desactivada y traslado este codigo a un servidor que tenga tambien desactivada esta configuracion , el codigo se ejecutara sin cambios.
Pero si este mismo codigo del mismo servidor lo traslado a un servidor en donde esa directiva este activada, cualquier entrada que haga el usuario producira “polución de backslash”.
Es decir si en una caja de texto ingreso
c:\windows\ y esa entrada la tomo como entrada para otras paginas, en la pagina que sigue se mostrara c:\\windows\\y en la que sigue c:\\\windows\\\ y asi se adicionara un backslash por cada vez que se use como entrada.

Con la funcion addslashes.

Es una forma mas versatil de usar escaping porque la usaremos dependiendo si la directiva magic_quotes_gpc este o no activada (si usamos PHP 5.3) de esta forma.

//Por ejemplo si $stripNombre forma parte de una sentencia SQL
// o para escribirlo en un archivo
if (get_magic_quotes_gpc()) {
      $stripNombre= $_POST['nombres'];
}
else{
      $stripNombre= addslashes($_POST['nombres']);
}

Adiciona un backslash por cada
– comilla simple.
– doble comilla.
– backslash.
– caracter nulo de ASCII (el valor ASCII cero).
Y se devuelve la cadena con sus respectivas secuencias de escape por cada caracter al que se le aplico escaping.
Si tenemos una caja de texto llamada traducciones e ingresamos este texto:

“I don’t know” significa “No lo sé\Desconozco”

al enviar esta cadena al script de php que le aplicara escaping :

$escapingText = addslashes($_POST['traducciones'])

se obtendra este resultado en la variable $escapingText :
\”I don\’t know\” significa \”No lo sé\\Desconozco\”

Usando funciones propias de la BD

Estas funciones estan disponibles en PHP gracias a las extensiones que brindan los manejadores de BD.
Gararantizan un nivel de seguridad mayor que si se usara solo magic_quotes_gpc ó addslashes para trabajar con datos que serán usados en sentencias SQL.
En MySQL una funcion muy usada para hacer escaping es mysql_real_escape_string.
Los caracteres a los que se le hace escaping son :
– \b
– \t
– \n
– \r
– \
– \s
Esta funcion es case sensitive.
Una buena pregunta es ¿alguien podria ingresar estos valores via una caja de texto ?
La respuesta es SI, y eso es lo que hacen los atacantes de paginas web para inyectar SQL.

Otro lugar donde uno ingresa esos caracteres (sin querer) es en los textarea, que se usan en facebook y en los foros. Uno ingresa algun texto y va dando enter para pasar a la siguiente linea, por supuesto estos caracteres son invisibles para nosotros, pero cuando se envia el comentario, estos caracteres invisibles no se pierden y son enviados con toda la data.

Si tengo un textarea llamado mensaje e ingreso este parrafo :
Hola a Todos

Mi nombre es Jorge, vivo en
O’higgins 485 La Merced

Para aplicar escaping con esta funcion reemplazo addslashes por mysql_real_escape_string :
$escapingText = mysql_real_escape_string($_POST[‘mensaje’])

Se obtendra este resultado en la variable $escapingText :
Hola a Todos\r\nMi nombre es Jorge, vivo en\r\n O\’higgins 485 La Merced

Y listo nuestra cadena esta lista para ser guarda en un campo en MySQL, en donde el Gestor de MySQL interpretará cada secuencia de escape y le hara corresponder el valor que representa este caracter y grabara los bytes correspondientes en ese campo.

Si tenemos la posibilidad de ver el contenido de un campo string de forma binaria en MySQL, nos mostrara los valores hexadecimales de los que esta compuesto el valor que contiene de dicho campo.
Un salto de linea sera una secuencia 0D0A que ha sido guardado por el Gestor de MySQL al intepretar un avance de linea desde las secuencias de escape \r\n.

Las secuencias de escape y HTML

El lenguaje HTML esta compuesto de elementos y tags.
Cada tag contiene un elemento que sera un enlace, un texto simple, un texto resaltado, etc.
Y por supuesto estaran compuestos de caracteres. Pero algunos de ellos pueden ser representados por mas de un caracter.
Estos son los HTML entity que son una secuencia de caracteres que es convertida por el browser en una sola como el   que esta compuesto de 6 caracteres y corresponde al caracter espacio.

Sus caracteres de escape son el & y el ;(punto y coma) y se aplican en este formato : al inicio & y terminan con ; . Existen 2 tipos los named y los numeric.

Algunos named entity :
´ a con tilde.
  el espacio.
ñ la eñe.
¡ la apertura de exclamación.
& el ampersand.

Los numeric entity son de esta forma: &#(numero decimal); .
Algunos numeric entity :
\ el backslash.
$ el simbolo de dolar.
% el simbolo de porcentaje.
” comillas dobles.
& el ampersand ( que tambien es un named entity).

El browser lee el HTML y renderiza una secuencia de bytes de acuerdo a una tabla de mapeo que hace corresponder la secuencia con un simbolo que es mostrado en el browser (si tiene representacion grafica).

Es importante indicar que para el intercambio de datos entre PHP, el browser, una BD o un archivo deberan ser enviados con el character set correcto.
Esto quiere decir que tanto PHP, la BD o el archivo deben todos usar el mismo Character Set y establecer el mismo para el browser. Mediante codigo se establece con la cabecera Content-type en la respuesta HTML.

En nuestro caso del español no es problema si queremos usar cualquier BD o compilador de PHP porque este usa el mismo que nosotros que es el UTF-8.

Una consecuencia favorable para nosotros es que podemos usar estos HTML entity en nuestro codigo PHP, con la ventaja que al ser enviado al browser, este se ahorra el convertir el HTML entity que le enviamos y lo usa tal cual, es decir pasa idéntico.

Un ejemplo mas real de esto es cuando importamos una BD de WordPress, proceso en que se produce la eliminacion de caracteres backslash del contenido de las paginas provocando que tengamos que colocarlas nuevamente.

Esto podriamos evitarlo colocando
\\ en vez de uno solo.
ó
usar el codigo HTML numeric entity del backslash : \

Mi pagina no sale como yo la codifico

A muchos de nosotros nos ha pasado que cuando creamos una página HTML (sea .htm, .html, .jsp. .php .phtml ) sea con el contenido estatico o mediante PHP, ASP, JSP, etc, y queremos hacer alguna de estas operaciones.
– colocar un tab entre dos palabras.
– colocar varios espacios entre dos palabras.
– colocar varias lineas vacias entre parrafos.
Obtenemos resultados muy diferentes visualmente a lo que nos imaginamos deberia suceder.
Esto se explica con 2 elementos :
– secuencias de escape.
– white space de HTML.

Cuando en nuestro codigo fuente usamos alguna secuencia de escape que sea :
– \r (retorno de carro)
– \n (avance de linea)
– \t (tab)
ó un espacio, estos son convertidos a un White Space de HTML.
Cada White Space que es leido por el browser es renderizado en la pantalla y obtenemos : jaja aqui esta lo bueno !un solo espacio¡ aunque usemos varios tabs ó varias lineas en blanco.
La explicacion es que el el white space de HTML hace que todas estas secuencias de escape sean convertidas a una sola por cada una o grupo de repeticiones de alguna.

Es decir puedo poner 20 espacios en mi codigo fuente y cuando veo mi pagina web solo aparece uno.

La explicacion que dan los creadores sobre este white space de HTML es que permite que los desarroladores de paginas puedan :
– ver el codigo fuente mas entendible.
– hacer debug mas facilmente.

Por ejemplo yo podria tener en mi codigo fuente este formulario :

<html>
<body>
<table border='0'>
<th>Registro de contacto</th>
<form action='insercion.php' method='post'>
<tr>
<td>Nombres</td>
<td><input type='text' name='nombres' /></td>
<tr>
<tr>
<td>Apellidos</td>
<td><input type='text' name='apellidos' /></td>
</tr>
<tr>
<td>email</td>
<td><input type='text' name='email' /></td>
</tr>
<tr>
<td>Mensaje</td>
<td><textarea name='mensaje'>
Texto de Prueba
</textarea></td>
</tr>
<tr>
<td></td>
<td><input type='submit' name='submit'></td>
</tr>
</form></table>
</body>
</html>

Este codigo es entendible para mi, con espacios entre lineas, identacion y espacios en blanco.
Pero para el navegados esto no importa porque el lo que ve es :

<html><body>
<table border='0'>
<th>Registro de contacto</th>
<form action='insercion.php' method='post'>
<tr>
<td>Nombres</td>
<td><input type='text' name='nombres' /></td>
<tr>
<tr>
<td>Apellidos</td>
<td><input type='text' name='apellidos' /></td>
</tr>
<tr>
<td>email</td>
<td><input type='text' name='email' /></td>
</tr>
... </html>

Por su misma naturaleza de interprete de lenguaje de HTML el solo analiza las marcas y va renderizando conforme cada tag le indique.
Una excepcion a esto es el tag <PRE> con el que podremos obtener la misma forma que tiene nuestro HTML en el codigo fuente.

Y en cuanto a lo de hacer debug mas facilmente, es consecuencia de tener un codigo mas entendible y asi encontrar algun posible error en la codificación.

Si se quiere poner algunos espacios se deberáusar el HTML named entity &nbsp; para colocar uno o varios espacios en blanco, aunque graficamente tampoco se obtenga un buen resultado.

Usando secuencias de escape en archivos

Puedo usar las funciones fwrite para colocar contenido en un archivo, en el que puede haber secuencias de escape para representar el new Line, el carriage return, los tabs, o cualquier otro caracter común.
No obstante estas secuencias de escape solo pueden pertenecer al lenguaje PHP.
Si queremos insertar una nueva linea en el archivo podemos intentar lo sgte :
– las HTML numeric entities y no producen ningun efecto.
– el tag <br> de HTML tampoco inserta una linea.
Y seran escritos en el archivo tal cual se ven.

Sin embargo si son validos :
– \r\n
– \x0D\x0A
Los cuales produciran una nueva linea.

Prueba este codigo para que veas la diferencia :

        $mif = fopen('arch.txt', 'w+');
        fwrite($mif, "En espaxF1ol
xa1Hola mundo! "OLE" xE7");
        fwrite($mif, "En espaxF1ol
xa1Hola mundo! "OLE" xE7 x0Dx0A");
        fwrite($mif, "En espaxF1ol
xa1Hola mundo! "OLE" xE7 rn");
        fwrite($mif, "En espaxF1ol
xa1Hola mundo! "OLE" xE7 
");
        fwrite($mif, "En espaxF1ol
xa1Hola mundo! "OLE" xE7
");
        fclose($mif);

Hay que tener en cuenta que si bien las secuencias de escape como \r y \n
no son visibles en el browser al ser guardadas como paginas SI tienen significado, porque ya no estan siendo “impresas” a un browser si no a un archivo que es el que estamos guardando.
Si en nuestra pagina php tenemos este codigo :

echo "
";
echo "Prueba con echo y caracteres PHP para insercion de linea
";
echo "En espaxF1ol
linea siguiente xa1Hola mundo! xE7 x0Ax0D linea siguiente";
echo "
";

Este codigo al ser mostrado en el browser y guardemos esa pagina, cuando la abramos en un editor simple tendra esta forma :

Prueba con echo y caracteres PHP para insercion de linea
En español
linea siguiente ¡Hola mundo! ç
linea siguiente

Pero si usamos una combinación de \r y \n o sólo \n con <br> en el mismo codigo :

echo "
rn";
echo "Prueba con echo y caracteres PHP para insercion de linea
n";
echo "En espaxF1ol
linea siguiente xa1Hola mundo! xE7 x0Ax0D linea siguienten";
echo "
n";

En el browser mostrara lo mismo, pero al abrirlo en el editor tendra una forma mas ordenada y entendible:

Prueba con echo y caracteres PHP para insercion de linea
En español
linea siguiente ¡Hola mundo! ç
linea siguiente

Como ve te aplican las mismas reglas que para la escritura de archivos usando secuencias de escape de PHP.
Obviamente quiza no necesitemos esta forma de ver nuestra página web, pero puede ser mas legible para alguien que quiera examinar la salida de nuestro codigo HTML.

Espero que este tema haya sido entendible e ilustrativo.

Visiten por favor pathpic en wordpress

1. Java Servlet Programming, 2nd Edition, Jason Hunter, William Crawford. Chapter 13. Internationalization, Appendix E. Character
Entities

2. Essential PHP Security, By Chris Shiflett, Chapter 2. Forms and URLs, Chapter 3. Databases and SQL.

3. PHP 5 Power Programming, Andi Gutmans, Stig Sæther Bakken, Derick Rethans. Chapter 5 : How to Write a Web Application with PHP.

4. Core PHP Programming, Third Edition, By Leon Atkinson . Appendix A. Escape Sequences

5. Php.ini. directiva magic_quotes_gpc.

6. DHTML and JavaScript, Gilorien. Part III — JavaScr ipt 1.3 (JavaScript 1.3 and Unicode), Part IV — Resources (White space)

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s