Sigueme por RSS! RSS

Funciones de filtro en PHP

Cada vez que desarrollamos un sistema, hay que validar cada campo que contenga valores introducidos por el usuario, todo lo enviado utilizando los métodos de petición (POST, GET, etc.), es necesario dejar de pensar que el usuario ingresara los datos correctamente y, hacer que el sistema sea estricto, solo de esa manera conseguiremos, seguridad, confiabilidad y confianza.

Son varias las funciones que PHP nos facilita para las validaciones, esta vez hablaremos un poco de las funciones de filtro.


A continuación una lista de las funciones filter:
- filter_has_var - verifica si la variable del tipo especificado existe
- filter_id - devuelve el ID del filtro con el nombre dado
- filter_input_array - obtiene múltiples variables desde afuera de PHP y opcionalmente las filtra
- filter_input - obtiene una variable desde afuera de PHP y opcionalmente la filtra
- filter_list - devuelve una lista de todos los filtros soportados
- filter_var_array - obtiene múltiples variables y opcionalmente las filtra
- filter_var - filtra una variable con un filtro específico

Los filtros son constantes que usaremos en algunas de las funciones mencionadas arriba;  tenemos una lista pre-definida: Validate filters (filtros de validación), Sanitize filters (filtros de saneamiento), Filter flags (opciones de filtro), Other filters.

Para este articulo nos centraremos en los filtros de validación:
- 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.
- FILTER_VALIDATE_URL - valida el valor coma una URL de acuerdo con la RFC 2396.


Lafunción filter_list como su nombre lo indica, nos devuelve una lista con los nombre de filtros:
echo '<pre>';
print_r(filter_list());
echo '</pre>';

devuelve:
Clic aquí para mostrar u ocultar el resultado
Array
(
    [0] => int // 257
    [1] => boolean // 258
    [2] => float // 259
    [3] => validate_regexp // 272
    [4] => validate_url
    [5] => validate_email // 274
    [6] => validate_ip // 275
    [7] => string // 513
    [8] => stripped // 513
    [9] => encoded // 514
    [10] => special_chars
    [11] => full_special_chars // 515
    [12] => unsafe_raw // 516
    [13] => email // 517
    [14] => url // 518
    [15] => number_int // 519
    [16] => number_float // 520
    [17] => magic_quotes // 521
    [18] => callback // 1024
)

filter_id devuelve el identificador para un determinado nombre de filtro.
echo filter_id('int');// devuelve 257
echo filter_id('email');// devuelve 517



filter_var — valida determinada variable dependiendo del filtro usado, sintaxis:
filter_var(variable,filtro,opciones)

donde:
variable - valor a filtrar
filtro - ID del filtro a usar, su valor predeterminado es FILTER_SANITIZE_STRING.
opciones - puede ser una constante o un array asociativo, el valor pasado modificarán el funcionamiento del filtro.

Ahora veamos algunos ejemplos usando los validate_filters y filter_flags:
Clic aquí para mostrar u ocultar los ejemplos


- FILTER_VALIDATE_EMAIL: valida la variable como una dirección de correo correcta.
// validamos una dirección de correo
echo filter_var('ID@gmail.com',FILTER_VALIDATE_EMAIL) ? 
'Email correcto' : 'Email Incorrecto'; // devuelve: Email correcto

// valida que la dirección tenga el formato [cadena]@[cadena].[cadena]
// devolvería true pasándole la cadena de caracteres: a@b.c

En lugar de la constante podríamos usar su ID, ejemplo:
// 274 -FILTER_VALIDATE_EMAIL
echo filter_var('ID@gmail.com',274) ?
'Email correcto' : 'Email Incorrecto'; // devuelve: Email correcto

flags: no requiere.


- FILTER_VALIDATE_URL: valida la variable coma una URL correcta (según la sintaxis rfc2396).
// validamos una URL
echo filter_var('http://cassianet.blogspot.com', FILTER_VALIDATE_URL) ? 
'URL válida' : 'URL invalida'; // devuelve: URL válida

echo filter_var('google.com', FILTER_VALIDATE_URL) ? 
'URL válida' : 'URL invalida'; // devuelve: URL invalida

flags:
1.- FILTER_FLAG_PATH_REQUIRED permite indicar que el dominio debe tener una barra invertida / seguida de alguna cadena de caracteres, ejemplo:
http://dominio/imagenes
http://dominio/index.php

echo filter_var('http://mi-sitio.com/imagenes', FILTER_VALIDATE_URL,FILTER_FLAG_PATH_REQUIRED) ? 
'URL válida' : 'URL invalida'; // devuelve: URL válida

2.- FILTER_FLAG_QUERY_REQUIRED requiere de query string en la URL para que sea válida. Es decir, que sea una URL del tipo:
http://misitio/index.php?param1=123&param2=cadena

$sURL = 'http://mi-sitio/index.php?param1=123';
echo filter_var($sURL, FILTER_VALIDATE_URL,FILTER_FLAG_QUERY_REQUIRED) ? 
'URL válida' : 'URL invalida'; // devuelve: URL válida


- FILTER_VALIDATE_IP: valida la variable como una dirección IP, opcionalmente se puede indicar que sea sólo IPv4 o IPv6 o que no sea de rangos privados o reservados.
echo filter_var('192.168.1.1', FILTER_VALIDATE_IP) ? 
'IP válida' : 'IP invalida'; // devuelve: IP válida

echo filter_var('192.168.1', FILTER_VALIDATE_IP) ? 
'IP válida' : 'IP invalida'; // devuelve: IP invalida

flags:
1.- FILTER_FLAG_IPV4 permite direcciones IP solo en formato IPv4.
echo filter_var('192.168.1.1', FILTER_VALIDATE_IP,FILTER_FLAG_IPV4) ? 
'IP válida' : 'IP invalida'; // devuelve: IP válida

2.- FILTER_FLAG_IPV6 permite direcciones IP solo en formato IPv6.
echo filter_var('192.168.1.1', FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) ? 
'IP válida' : 'IP invalida'; // devuelve: IP invalida

3.- FILTER_FLAG_NO_PRIV_RANGE
- falla si se intenta validar alguna de los siguientes rangos privados de IPv4: 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16.
- falla si se intenta validar direcciones IPv6 que empiecen por FD o FC.

4.- FILTER_FLAG_NO_RES_RANGE  falla si se intenta validar alguno de los siguientes rangos IPv4 reservados: 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 y 224.0.0.0/4. Este flag no se aplica a direcciones IPv6.



- FILTER_VALIDATE_REGEXP valida la variable contra una expresión regular pasada como tercer parámetro de filter_var.
$sCadena = 'letras123';
echo filter_var($sCadena, FILTER_VALIDATE_REGEXP, 
array('options' => array('regexp' => "/^[a-zA-Z]+$/"))) ? 
'El valor es correcto' : 'El valor es incorrecto'; // devuelve: El valor es incorrecto

echo filter_var($sCadena, FILTER_VALIDATE_REGEXP, 
array('options' => array('regexp' => "/^[a-zA-Z0-9]+$/"))) ? 
'El valor es correcto' : 'El valor es incorrecto'; // devuelve: El valor es correcto

flags: no requiere.


- FILTER_VALIDATE_INT valida la variable como un número entero.
$Num = 2011;
echo filter_var($Num, FILTER_VALIDATE_INT) ? 
"$Num es de tipo entero" : "$Num NO es de tipo entero"; 
// devuelve: Es de tipo entero

opciones:
puede recibir en el tercer parámetro un array indicando el valor mínimo y máximo permitido (min_range y max_range), ejemplo:
$Num = 1000;
echo filter_var($Num, FILTER_VALIDATE_INT,
array("options"=> array("min_range"=>0, "max_range"=>256))) ?
"$Num está dentro del rango" : "$Num NO está dentro del rango"; 
// devuelve: No está dentro del rango

Como vemos, podemos pasar varias opciones en el tercer parámetro y al mismo tiempo.

flags:
1.- FILTER_FLAG_ALLOW_OCTAL permite datos de entrada que comiencen por un cero (0) como número octal. Esto obliga a que los siguientes dígitos sean únicamente 0-7.
//74=1,001,010=112
echo filter_var(0112, FILTER_VALIDATE_INT,FILTER_FLAG_ALLOW_OCTAL) ?
'valor correcto' : 'valor incorrecto'; // devuelve: valor correcto

2.- FILTER_FLAG_ALLOW_HEX permite datos de entrada que comiencen por 0x o 0X como número hexadecimal. Esto obliga a que los siguientes dígitos sean únicamente a-fA-F0-9.
echo filter_var('0xf0', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) ?
'valor correcto' : 'valor incorrecto'; // devuelve: valor correcto

echo filter_var('0f0', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) ?
'valor correcto' : 'valor incorrecto'; // devuelve: valor incorrecto

Otro ejemplo:
echo filter_var('0xf1',FILTER_VALIDATE_INT,
  // opciones
  array(
    'flags'   => FILTER_FLAG_ALLOW_HEX,
    'options' => array('min_range' => 1, 'max_range' => 0xf0)
  )
) ? 'valor correcto' : 'valor incorrecto';
// devuelve: valor incorrecto, por salirse del rango


- FILTER_VALIDATE_BOOLEAN - devuelve TRUE para si el valor de la variable pasada es (1,TRUE,ON,YES) y FALSE en caso contrario.
echo filter_var('ON', FILTER_VALIDATE_BOOLEAN) ?
'valor correcto' : 'valor incorrecto'; // devuelve: valor correcto

echo filter_var(10010, FILTER_VALIDATE_BOOLEAN) ?
'valor correcto' : 'valor incorrecto'; // devuelve: valor incorrecto

flags:
1.- FILTER_NULL_ON_FAILURE retorna NULL para valores boolean que no se reconozcan.


- FILTER_VALIDATE_FLOAT - valida que el valor sea de tipo float.
echo filter_var(8.5, FILTER_VALIDATE_FLOAT) ?
'Es de tipo float' : 'NO es de tipo float';// devuelve: Es de tipo float

echo filter_var('111,109.40', FILTER_VALIDATE_FLOAT) ?
'Es de tipo float' : 'NO es de tipo float';// devuelve: NO es de tipo float

flags:
1.- FILTER_FLAG_ALLOW_THOUSAND permite usar una coma (,) como separador de miles en los números. También puede ser usado con los filtros FILTER_SANITIZE_NUMBER_FLOAT, FILTER_VALIDATE_FLOAT.
echo filter_var('111,109.40', FILTER_VALIDATE_FLOAT,FILTER_FLAG_ALLOW_THOUSAND) ?
'Es de tipo float' : 'NO es de tipo float';// devuelve: Es de tipo float


filter_has_var — devuelve true si existe una variable de un tipo concreto, sintaxis:
filter_has_var(tipo,nombre_variable)

donde tipo puede ser: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV. Ejemplo:
// devolvera el valor del parametro si existe ?param1=valor
echo filter_has_var(INPUT_GET, 'param1') ? 
  'el parámetro existe - param1= '.$_GET['param1'] : 'el parámetro No existe'; 


filter_input — es similar a filter_has_var con la diferencia que permite validar esas variables directamente, devuelve la variable filtrada si hubo éxito, FALSE si es incorrecto su valor, o NULL si la variable no está definida.
Su sintaxis:
filter_input(tipo,nombre_variable,filtro,opciones)

donde tipo puede ser: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV.

echo filter_input(INPUT_GET, 'param1', FILTER_VALIDATE_BOOLEAN) ? 'correcto' : 'incorrecto';
echo filter_input(INPUT_GET, 'param2', FILTER_VALIDATE_BOOLEAN) ? 'correcto' : 'incorrecto';
echo filter_input(INPUT_GET, 'param3', FILTER_VALIDATE_BOOLEAN) ? 'correcto' : 'incorrecto';
echo filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) ? 'Email correcto' : 'Email incorrecto';



Solo restan las funciones filter que trabajan con array, trabajar con otros filtros, sanear las variables, etc. eso ya será en otra oportunidad.

Para simplificar un poco se hizo uso del operador ternario, puedes echarle una ojeada si lo desconoces y regresar luego con calma a leer el articulo, no olvides que la mejor forma de aprender es leer y probar, ensayo y error.

Referencias:
php.net/filter

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.