Introducción: la importancia de validar y sanear datos
Un punto crítico de cualquier tipo de aplicación es la entrada de datos por parte del usuario, ya que, si no se toman las medidas oportunas, un usuario puede (intencionadamente o no) causar fallos en la aplicación.En el mundo del desarrollo web, esto cobra mucha más importancia, pues se incrementa mucho el número de usuarios potenciales y por tanto, el número de usuarios malintencionados. Ataques conocidos y fáciles de llevar a cabo son SQL Inyection y XSS (Cross Site Scripting).
En aplicaciones web es importante realizar siempre la validación en el lado del servidor.Otra vulnerabilidad que tiene que ver con la validación, que es debido muchas veces a la inexperiencia del desarrollador, es confiar la validación de lados al lado de cliente (Javascript). Esto es algo grave, pues existen herramientas para enviar datos a una web sin que intervenga para nada un navegador ni Javascript.
La extensión Filter
Esta extensión de PHP nos expone un conjunto de funciones que nos permitirán la validación y saneamiento de datos de una forma sencilla. La funcion filter_var nos permite filtrar una variable según el filtro especificado. El orden de los parámetros es el siguiente:- $var: Variable que se quiere filtrar
- $filter: Filtro que se desea aplicar. Será una constante numérica
- $options: Conjunto de opciones que modificarán el funcionamiento del filtro. Será una constante numérica o un array
FILTER_VALIDATE_BOOLEAN
Valida la variable como un booleano.
FILTER_VALIDATE_EMAIL
Valida la variable como una dirección de correo electrónico correcta.
FILTER_VALIDATE_FLOAT
Valida que la variable sea del tipo float.
FILTER_VALIDATE_INT
Valida la variable como un número entero.
FILTER_VALIDATE_IP
Valida la variable como una dirección IP.
FILTER_VALIDATE_REGEXP
Valida la variable contra una expresión regular enviada en la variable de opciones.
FILTER_VALIDATE_URL
Valida el valor coma una URL de acuerdo con la RFC 2396.
A continuación el listado de filtros para sanear:
FILTER_SANITIZE_EMAIL
Elimina todos los caracteres execpto letras, números y !#$%&’*+-/=?^_`{|}~@.[].
FILTER_SANITIZE_ENCODED
Codifica la cadena como una URL válida.
FILTER_SANITIZE_MAGIC_QUOTES
Aplica la función addslashes.
FILTER_SANITIZE_NUMBER_FLOAT
Elimina todos los caracteres excepto números, +- y opcionalmente ,.eE.
FILTER_SANITIZE_NUMBER_INT
Elimina todos los caracteres excepto números y los signos + -.
FILTER_SANITIZE_SPECIAL_CHARS
Escapa caracteres HTML y caracteres con ASCII menor a 32.
FILTER_SANITIZE_STRING
Elimina etiquetas, opcionalmente elimina o codifica caracteres especiales.
FILTER_SANITIZE_STRIPPED
Alias del filtro anterior.
FILTER_SANITIZE_URL
Elimina todos los caracteres excepto números, letras y $-_.+!*’(),{}|\\^~[]`<>#%”;/?:@&=.
Validar y sanear un número entero
Vamos a ver un sencillo ejemplo de validación de un número entero.- <?php
- $var = 123;
- echo filter_var($var, FILTER_VALIDATE_INT);
- <?php
- $var = 'dos';
- if(filter_var($var, FILTER_VALIDATE_INT) === false){
- echo 'Valor incorrecto';
- }else{
- echo 'Valor correcto';
- }
- array('min_range'=>10, 'max_range' => 20));
- if(filter_var($var, FILTER_VALIDATE_INT, $options) === false){
- echo 'Valor incorrecto';
- }else{
- echo 'Valor correcto';
- }
- <?php
- $var = 'uno23';
- echo filter_var($var, FILTER_SANITIZE_NUMBER_INT);
Validar y sanear un número float
La validación simple de un float es practicamente igual que la de un entero:- <php
- $var = 1.3;
- echo filter_var($var, FILTER_VALIDATE_FLOAT);
- <php
- $var = '1,3';
- $options = array('options'=>array('decimal'=>','));
- echo filter_var($var, FILTER_VALIDATE_FLOAT, $options);
Saneamiento de textos
La limpieza de los textos es algo muy importante y por ello tenemos varios flags que modifican el comporamiento del filtro FILTER_SANITIZE_STRING:FILTER_FLAG_NO_ENCODE_QUOTES
No codificará las comillas simples ni dobles.
FILTER_FLAG_STRIP_LOW
Elimina caracteres cuyo varlor ASCII sea menor a 32.
FILTER_FLAG_STRIP_HIGH
Elimina caracteres cuyo valor ASCII sea mayor a 127.
FILTER_FLAG_ENCODE_LOW
Codifica caracteres cuyo valor ASCII sea mennor a 32.
FILTER_FLAG_ENCODE_HIGH
Codifica caracteres cuyo valor ASCII sea mayor a 127.
FILTER_FLAG_ENCODE_AMP
Codifica ampersands (&).
A continuación algunos ejemplos:
- <php
- $text = '<p>"Hola mundo!"</p>';
- echo filter_var($text, FILTER_SANITIZE_STRING);
- //Resultado: "Hola mundo!"
- <php
- $text = '<p>"Hola mundo!"</p>';
- echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
- //Resultado: "Hola mundo!"
- <php
- $text = '"Ontuts & Cokidoo"';
- echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_FLAG_ENCODE_AMP);
- //Resultado: "Ontuts & Cokidoo"
Obtener variables externas
Además de la función filter_var, existe una muy interesante llamada filter_input. Esta funcion nos permite obtener una variable externa por su nombre, filtrándola si es necesario.Es importante que todas las variables externas, es decir, que nos llegan desde el lado del cliente ($_GET, $_POST, $_COOKIE…) las obtengamos a través de esta función para ahorrarnos disgustos. En el siguiente ejemplo vemos como obtener un parámetro GET de la petición con esta función:
- <php
- $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
- if($page !== null && $page !== false){
- //El parametro ha sido enviado y es un entero
- }else{
- //El parametro no se ha enviado o no es un entero
- }
El primer parámetro indica de que ámbito será extraída la variable, y puede ser uno de los siguientes valores:
- INPUT_GET
- INPUT_POST
- INPUT_COOKIE
- INPUT_SERVER
- INPUT_ENV
- <?php
- $args = array(
- 'product_id' => FILTER_SANITIZE_ENCODED,
- 'component' => array('filter' => FILTER_VALIDATE_INT,
- 'flags' => FILTER_REQUIRE_ARRAY,
- 'options' => array('min_range' => 1, 'max_range' => 10)
- ),
- 'versions' => FILTER_SANITIZE_ENCODED
- );
- $myinputs = filter_input_array(INPUT_POST, $args);
Conclusión
Como puedes observar, PHP nos brinda una gran librería con la cual podemos llevar a cabo validaciones y saneamientos en cuestion de segundos, cosa que antes se hacía bastante engorrosa.Ahora no hay excusa que valga para asegurarnos de que nuestros datos estén bien limpios y seguros .
¡Nos vemos en la próxima publicación!
No hay comentarios:
Publicar un comentario