[ TEMIGA ]
Filter un misterio de PHP.
Todas las aplicaciones (Web, Escritorio, Consola) dependen que datos externos para crear una salida o iniciar un proceso, estos datos pueden venir desde un usuario u otra aplicación (WebService, formulario, etc…) por eso la premisa #1 de todo desarrollador debe:
Filtrar todos los datos externos
El filtrado de datos es una de las piedras angulares en cualquier aplicación en el tema de seguridad, independientemente del lenguaje donde se trabaje. PHP proporciona una amplia gama de herramientas y funciones para filtrar o validar los datos, pero a diferencia de otros lenguajes, no tiene funciones estándar para filtrar los datos (como cgi de perl).
La extensión Filter llena este vacío y viene a suplir muchas expresiones regulares que son extremadamente lentas para validar formatos y datos de entradas, estas son muchas de las bondades de PHP que muchos desarrolladores no suelen utilizar y que vienen a ser parte de las buenas practicas de desarrollo sobre este lenguaje.
Este componente cuenta con constantes que representan los filtros a ser aplicados y ademas estos se pueden aplicar sobre array’s conocidos (POST, GET, COOKIE, etc) de manera que se vuelve flexible, para este tipo de validaciones y/o sanamiento de los datos de entrada, veamos unos ejemplos.
imaginemos que enviamos por $_GET un dato que lo hemos llamado ‘mode’
if($_GET['mode']){ if(!is_numeric($_GET['mode'])){ echo "'mode' no es un entero"; } else { echo "'mode' es un entero"; return (int)$_GET['mode']; } }
Ahora utilizando el Filter filter_input
$mode = filter_input(INPUT_GET, 'mode', FILTER_VALIDATE_INT); if(!$mode){ echo "'mode' no es un entero"; } else { echo "mode es: $mode"; return $mode; }
Ya podemos apreciar que nuestro código se limpia y si le hacemos un benchmark seguramente también será mas rápido ;-)
Consideraciones sobre los filtros
- Santizing(limpieza) filtros, Permitir o denegar los caracteres de una cadena, siempre retorna una cadena
- Filtros Lógicos, Conoce los formatos devuelve el tipo esperado de éxito.
Un formulario, aplicando filtros lógicos.
<form action="example.php" method="post"> Ingrese su Edad: <input name="age" size="2" /> <input name="submit" type="submit" value="Ir" /> </form>
Y el script que procesa esta información seria:
if (filter_has_var(INPUT_POST, 'submit')) { echo 'Se envió el form'; } $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT); if (is_null($age)) { echo "La 'edad' es un campo requerido!"; } elseif ($age === FALSE) { echo 'Ingrese una edad valida'; } else { echo 'Bienvenido.'; }
Bien como vemos solo validamos que la edad sea un numero entero, pero existen algunos filtros que soportan options para que las validaciones sean mas precisas. Ahora la edad debe pasar la condición que debe estar entre un rango entre 7 y 77. veamos la utilización con el código anterior.
if (filter_has_var(INPUT_POST, 'submit')) { echo 'Se envió el form'; } $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, array('options'=> array('min_range'=>7, 'max_range'=>77)); if (is_null($age)) { echo "La 'edad' es un campo requerido!"; } elseif ($age === FALSE) { echo 'Ingrese una edad valida'; } else { echo 'Bienvenido.'; }
Un formulario, aplicando filtros Santizing.
<form action="example01.php" method="post"> Ingrese su Nombre: <input name="name" size="50" /> <input name="submit" type="submit" value="Ir" /> </form>
Y script que lo procesa…
if (filter_has_var(INPUT_POST, 'submit')) { echo 'Se envió el form'; } $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); if (is_null($name)) { echo "El 'nombre' es un campo requerido!"; } else { echo "Bienvenido, $name"; }
En PHP 5.x esta extensión viene por defecto.
Por último dejo un post de PHPPro donde servirá de guía para muchos, de manera que escalemos nuestras formas de validar datos.
| Imprimir artículo | Este artículo fue publicado por CaChi el Febrero 16, 2009 a las 10:28 pm, y está archivado en PHP5, Planeta Linux, Programación. Sigue las respuestas a esta entrada a través de RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio. |






