Secuencias de escape y escaping en PHP.

Secuencias de escape y escaping en PHP.

Existen caracteres que no tienen representación gráfica, que son denominados caracteres de control. Con el fin de poder representarlos en el código fuente, se recurrió al artificio de agregar 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

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

Escaping

Se llama escaping a la adición de un caracter de escape (usualmente un backslash) a un caracter o siendo mas genericos a una secuencia de caracteres para poder representarlos gráficamente.

Generalmente cuando se aplica a un string, o un valor que se obtenga desde GET, POST, 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 función 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 tiene 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 configuración (en Php.ini) activada esta directiva se hace una adición de un backslash por a estos caracteres (con las mismas reglas que la función 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 código sera necesaria para aplicar la adición 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 evaluación de secuencias de escape según 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 funciones de scaping al recibir una petición del browser.

Que pasa si NO se usa magic_quotes_gpc activada.
* Tendremos que usar alguna función de escaping al recibir una petición 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 código corriendo en un servidor en donde esta directiva este desactivada y traslado este código a un servidor que tenga tambien desactivada esta configuración , el código se ejecutara sin cambios.
Pero si este mismo código del mismo servidor lo traslado a un servidor en donde esa directiva este activada, cualquier entrada que haga el usuario producirá “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 recepciona el texto 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, es decir se agrega un backslash por cada envío.

Con la función 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 obtiene en $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 función es case sensitive.
Una buena pregunta es ¿alguien puede ingresar estos valores en 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 algún texto y va dando enter para pasar a la siguiente linea, por supuesto estos caracteres son invisibles para nosotros, pero cuando se envía el comentario, estos caracteres invisibles no se pierden y son enviados con toda la data.

Si tengo un textarea llamado mensaje e ingreso este contenido en html :

<h1>Dirección<h1>
O'higgins 485 La Merced
<h1>Estado civil</h1>
Soltero
<ul>
Hobbies
<li>Hobbie1</li>
<li>Hobbie2</li>
<li>Hobbie3</li>
<li>Hobbie4</li>
</ul>

En la página que procesa la petición se tiene:

// 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.
Texto de Campo Varchar
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.
Campo Varchar en Hexadecimal.

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 : &(nombre de entity); (al final punto y coma). Existen 2 tipos los named y los numeric.

Algunos named entity :

acute a con tilde.
nbsp el espacio.
ntilde la eñe.
iexcl la apertura de exclamación.
amp el ampersand.

Los numeric entity son de esta forma: &#(numero decimal); (al final punto y coma).
Algunos valores de numeric entity :

92 el backslash.
36 el simbolo de dolar.
37 el simbolo de porcentaje.
34 comillas dobles.
38 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 código 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 real de esto es cuando importamos una BD de WordPress, proceso en que se produce la eliminación de caracteres backslash del contenido de las páginas provocando que tengamos que colocarlas nuevamente.

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

Mi página 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 vacías entre parrafos.
Obtenemos resultados muy diferentes visualmente a lo que nos imaginamos debería suceder.
Esto se explica con 2 elementos :
– secuencias de escape.
– white space de HTML.

Cuando en nuestro código 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 explicación 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 explicación que dan los creadores sobre este white space de HTML es que permite que los desarroladores de páginas puedan :
– ver el código fuente mas entendible.
– hacer debug mas fácilmente.

Por ejemplo yo podría tener en mi código 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 código es entendible para mi, con espacios entre lineas, identación y espacios en blanco.
Pero para el navegador 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 sólo analiza las marcas y va renderizando conforme cada tag le indique.
Una excepción a esto es el tag PRE con el que podremos obtener la misma forma que tiene nuestro HTML en el código fuente.

Y en cuanto a lo de hacer debug mas fácilmente, es consecuencia de tener un código mas entendible y asi encontrar algún 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 gráficamente 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 que no producen ningun efecto.
– el tag
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 código para que veas la diferencia :
escaping_arch
Produce este contenido en el archivo arch.txt
contenido de archivo.

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 páginas SI tienen significado, porque ya no estan siendo “impresas” a un browser si no a un archivo que es el que estamos guardando.

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 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)

7. Numeric Code Character Entities, http://www.december.com/html/spec/codes.htmlhp

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