Introducción: la importancia de validar y sanear datosUn 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 A continuación un listado de filtros de validación posibles: 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. $var = 123.y opcionalmente . La función nos devolverá el entero en caso de que la validación sea correcta. FILTER_SANITIZE_NUMBER_FLOAT Elimina todos los caracteres excepto números. FILTER_SANITIZE_ENCODED Codifica la cadena como una URL válida. .{}|\\^~[]`<>#%”. FILTER_SANITIZE_SPECIAL_CHARS Escapa caracteres HTML y caracteres con ASCII menor a 32.. nos devolverá FALSE. view plaincopy to clipboardprint? 1. FILTER_SANITIZE_URL Elimina todos los caracteres excepto números.[]. 3.+!*’(). FILTER_VALIDATE_URL Valida el valor coma una URL de acuerdo con la RFC 2396. echo filter_var($var. FILTER_SANITIZE_MAGIC_QUOTES Aplica la función addslashes./?:@&=. números y !#$%&’*+-/=?^_`{|}[email protected]. A continuación el listado de filtros para sanear: FILTER_SANITIZE_EMAIL Elimina todos los caracteres execpto letras.FILTER_VALIDATE_REGEXP Valida la variable contra una expresión regular enviada en la variable de opciones. opcionalmente elimina o codifica caracteres especiales. en caso contrario. <?php 2. FILTER_SANITIZE_NUMBER_INT Elimina todos los caracteres excepto números y los signos + -. FILTER_SANITIZE_STRING Elimina etiquetas. FILTER_SANITIZE_STRIPPED Alias del filtro anterior. FILTER_VALIDATE_INT). +. Validar y sanear un número entero Vamos a ver un sencillo ejemplo de validación de un número entero. letras y $-_. para los que no entiendan. if(filter_var($var. 5. 4. 6. 4. 7. <php 2. podemos jugar con las opciones para hacer ajustar el comportamiento de la función a nuestras necesidades. 6. sanear significa limpiar. 3. FILTER_SANITIZE_NUMBER_INT). $var = 'uno23'. } Ahora vamos a ver como sanear un entero. if(filter_var($var. FILTER_VALIDATE_INT) === false){ echo 'Valor incorrecto'. 2. con este filtro tenemos una opcion interesante que nos permite especificar cual es el caracter que separa los decimales.view plaincopy to clipboardprint? 1. En el siguiente ejemplo se muestra como validar un entero que esté dentro de un rango específico: view plaincopy to clipboardprint? 1. es decir. <php . 2. <?php 2. 4. 7. echo filter_var($var. Validar y sanear un número float La validación simple de un float es practicamente igual que la de un entero: view plaincopy to clipboardprint? 1. 4. $options = array('min_range'=>10. } A la hora de validar un entero. echo filter_var($var. quitamos todo lo que no tiene cabida en nuestro campo. Sin embargo. $options) === false){ echo 'Valor incorrecto'. 3. FILTER_VALIDATE_FLOAT). 3. 5. view plaincopy to clipboardprint? 1.3. FILTER_VALIDATE_INT. $var = 1. view plaincopy to clipboardprint? 1. }else{ echo 'Valor correcto'. }else{ echo 'Valor correcto'. <?php $var = 'dos'. 'max_range' => 20)). El código anterior nos devuelve ’23′ debido a que elimina todos los caracteres no numéricos de la cadena. 3. echo filter_var($text. <php 2. Cokidoo" . FILTER_FLAG_ENCODE_HIGH Codifica caracteres cuyo valor ASCII sea mayor a 127.')). //Resultado: "Ontuts &. FILTER_VALIDATE_FLOAT. $options = array('options'=>array('decimal'=>'. FILTER_FLAG_ENCODE_LOW Codifica caracteres cuyo valor ASCII sea mennor a 32. echo filter_var($var.2. FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_FLAG_ENCODE_AMP). 3. FILTER_SANITIZE_STRING. FILTER_SANITIZE_STRING). FILTER_FLAG_STRIP_LOW Elimina caracteres cuyo varlor ASCII sea menor a 32. FILTER_FLAG_ENCODE_AMP Codifica ampersands (&). echo filter_var($text. //Resultado: "Hola mundo!" view plaincopy to clipboardprint? 1. $options). FILTER_SANITIZE_STRING. //Resultado: ". FILTER_FLAG_STRIP_HIGH Elimina caracteres cuyo valor ASCII sea mayor a 127. $text = '"Ontuts & Cokidoo"'. view plaincopy to clipboardprint? 1. <php $text = '<p>"Hola mundo!"</p>'. A continuación algunos ejemplos: view plaincopy to clipboardprint? 1. 3. 5. echo filter_var($text. 2. <php $text = '<p>"Hola mundo!"</p>'.Hola mundo!". 4. 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. 3. 3. 2. 4. 4. 4. $var = '1.3'. FILTER_FLAG_NO_ENCODE_QUOTES). 'flags' => FILTER_REQUIRE_ARRAY. <php $page = filter_input(INPUT_GET. y puede ser uno de los siguientes valores: INPUT_GET INPUT_POST INPUT_COOKIE INPUT_SERVER INPUT_ENV Otra función relacionada y muy interesante es filter_input_array que nos permite definir una serie de validaciones para múltiples campos. 2. podemos hacer la validación todos los campos de un formulario en un solo paso. $myinputs = filter_input_array(INPUT_POST. 10. 3. 'options' => array('min_range' => 1. 'max_range' => 10) ). 7. 5. 9. $_COOKIE…) las obtengamos a través de esta función para ahorrarnos disgustos. $args). 4. 6. es decir. 'component' => array('filter' => 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 } Esta función nos devolverá NULL si la variable no ha sido enviada. 'page'. 11. 'versions' => FILTER_SANITIZE_ENCODED ). Es decir. FALSE si la variable ha sido enviada pero no validada o el valor de la variable si ha sido enviada y validada. filtrándola si es necesario. 5. 2. . 6. 4. Esta funcion nos permite obtener una variable externa por su nombre. El primer parámetro indica de que ámbito será extraída la variable. 7. 3. <?php $args = array( 'product_id' => FILTER_SANITIZE_ENCODED. La definición de los campos con sus validaciones se hace mediante un array como se muestra en el siguiente ejemplo: view plaincopy to clipboardprint? 1. FILTER_VALIDATE_INT).Obtener variables externas Además de la función filter_var. 8. que nos llegan desde el lado del cliente ($_GET. Es importante que todas las variables externas. $_POST. En el siguiente ejemplo vemos como obtener un parámetro GET de la petición con esta función: view plaincopy to clipboardprint? 1. existe una muy interesante llamada filter_input. 8. 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.Esta función devuelve un array del tipo clave/valor que contiene los nombres de los campos junto con su filtrado. 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! . bS^ú ú [\`[Z_S^^S ú[\`[Z_úS^^S úVWUSúúú´´ WU[X`W^bS^bS^ . 7/5739 \\ `W `ú\û [SaZV[ û¯\ú WU[X`W^bS^`W ` ´ ¯¯W_a`SV[ [SaZV[ .5-4.250.42547..390547049030248..8.3/8 ..20394/01974%#*$%*$%# %#** * *"& %$ 4... %#** *! 4/1..:4..47.:348002548 ./0489094808.30.203347.[\`[Z_´ $.:4.747$80..4/1...25078..47$80.90708.4393:..86:0 24/1..90708.3. %#** * 4/1.4594.5-4.7/5739 \\ `W `ú\û [SaZV[ û¯\ú WU[X`W^bS^`W ` ¯¯W_a`SV[û [SaZV[ û .05. %#**$%#!* 23..47.7.8825083/4-08 %#**$%#!* 23.7E..:4.47$80..42:25479.2.2.4594..20394/090948 .7.7.90708. %#** * 4/1.7481....90708.20347..42.3...:4.47$80..30.05.O3.7. . . 5-4.4594.7/5739 \\ `W `úû.3.´ .05. Z`a`_ [V[[ûú WU[X`W^bS^`W ` . ´ ¯¯W_a`SV[û. Z`a`_ S\[V[[û . . . ° . O3/048.7.43../.1907*35:989.3/08/00.020/.. ..3.-0809073./.07E&8.25488/0.7403:38445.-08.8 08/0.7.O3 94/4848.7.47/0./...-0809073.2..97..8/403. 509..477.O31907*./.4594...7.-009073./.248.-0 ..43085..507434.O3..8070/0..77..40.430880.../06:0E2-94807E097.7..././.6:0348507290/0137 :3.05.84-903.4594.O3 .7.O3348/0.43089.0308:039000254 .1:3.8/403.-0 5:0/0807:34/048 8:03908.J/.5478:342-70 197E3/4..1:3.390:3.7/5739 £\\ S^Y_S^^S ú\^[VaU`Vú ..2548/0:31472:.-034.4.5-4.390081907*35:9*..4244-90307:35./..8 /02E8/0.F8/0089.8/403.3906:094/././4/0 .424802:0897.5-4..808 30. 1:3..77.O35.07.0248./.7E20974%/0...7 54/0248...433485072904-90307:3./. 572075.1:3.29508.O370.05.390..2:390708..08./.2548..7.438:8 .7348/8:8948308:039000254.0390 *% *! $% * .74 825479.7 0890:3.8.4708 O O O O O !&%*% !&%*! $% !&%* !&%*$#'# !&%*' 97..2:390708...7/5739 \\ \SYWX`W^Z\a` ú\SYWú ´ X\SYW Za \SYW XS_W´» ¯¯\S^SW`^[S_V[WZbSV[ W_aZWZ`W^[ ¼W_W» ¯¯\S^SW`^[Z[_WSWZbSV[[Z[W_aZWZ`W^[ ¼ 89.7.7E209743/./013.1:3.-90307.84.7 6:03480.1:3..7.8.3.. $8.. úU[\[ZWZ`úS^^S úX`W^ú úXSY_ú ú[\`[Z_úS^^S úZ^SZYWú úS ^SZYWú ´ ´ úbW^_[Z_ú . ´ Z\a`_X`W^Z\a`S^^S . S^Y_´ . ..:0./0954.77.1:3.0.0:3.89.O3/0. .43..7.:08943/080:3/48 ..6:0.20394803.476:0.57O2.2548:394.7 !!348-73/.948089F3-032548 80:748 48.43903048342-708/048 .390880.:3.48. 47..J..5.:.O3 .:8O3 4245:0/084-807..43088.../..80:7.7.34.6:0.89..5:-.:8..-4 .54/02480.30..-../4 43...7348/06:03:089748/...7.3-707J.0.390 0347748.024803.438:197.