Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => PHP => Mensaje iniciado por: Alex_bro en 23 Julio 2015, 18:34 PM

Título: [Aporte] Mi función PHP para limpiar inputs
Publicado por: Alex_bro en 23 Julio 2015, 18:34 PM
Buenas!

Hoy os traigo una función que publiqué hace tiempo aquí también pero con ciertas mejoras, con la esperanza de que pueda servir a alguien más.

¿Qué permite?

¿Qué NO permite?
No está pensada para validar campos (Ej. Email correcto, etc), solo como primer filtro a pasar por todos los inputs que provengan del exterior. Para esos usos, la función nativa filter_var (http://php.net/manual/es/function.filter-var.php) de PHP puede ser una alternativa.

Personalización
La función está escrita de forma que permita vocales acentuadas y eñes. Si no se desea basta con borrarlos de la cuarta linea. Si dejas estos caracteres asegurate de guardar el archivo que contiene la función con una codificación válida, como UTF-8.
Además, a modo de prevenir ataques XSS aplica la función htmlentities (http://php.net/manual/es/function.htmlentities.php), pero a algunos les gusta aplicarla en la vista de su aplicación... a mi me parece mejor hacerlo al guardar los datos para optimizar la carga en la lectura de datos, pero casi es una cuestión de gustos.

El código

function clean_var($var,$num=0,$let=0,$max=0,$cars_exp=''){
       $expr = '/[^';
       if($num == 1) $expr = $expr.'0-9';
       if($let == 1) $expr = $expr.'a-zA-ZñÑáéíóúÁÉÍÓÚ';
       if($cars_exp != ''){
           $cars_ok = preg_quote($cars_exp,'/');
           $cars_ok = str_replace(' ','\s',$cars_ok);
           $expr .= $cars_ok;
       }
       $expr .= ']/iu';
       $var = preg_replace($expr,'',$var);

       if($max != 0 && strlen($var) > $max){
           $var = substr($var,0,$max);
       }
       return htmlentities(trim($var), ENT_QUOTES); //AntiXSS
}


He intentado ponerle la etiqueta php a code para que se colorease, pero muestra los acentos como entidades html en ese caso.

Ejemplos

Código (php) [Seleccionar]

$secure_var = clean_var($_GET['insecure_var'],1,0,10); // Solo numeros, max. 10 caracteres.
$secure_var = clean_var($_GET['insecure_var'],1,1,10); // Solo numeros y letras, max. 10 c.
$secure_var = clean_var($_GET['insecure_var'],0,1,10,' '); // Letras y espacios, max. 10 c.
$secure_var = clean_var($_GET['insecure_var'],1,1,25,'@._-'); // Posible e-mail. Max 25 c.
$secure_var = clean_var($_GET['insecure_var'],1,1,50,'@._-?)(][,'); // Mas caracteres. Max. 50 c.


Mejoras!
Por favor, si ves algo mejorable en la función dilo abajo! Será de gran ayuda para todos, especialmente si está relacionado con la seguridad. A veces he obtenido comportamientos extraños al usar guiones medios a pesar de usar preg_quote (http://php.net/manual/es/function.preg-quote.php), y ahora intento escribirlos al final del parámetro para que no den problemas... si saben por qué ocurre eso sería genial.

Gracias por leer el tocho! :)