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?
- Eliminar todos los caracteres que no estén previstos -> Security By Default
- Cortar las cadenas con más de X caracteres si se desea. Esto puede ayudar a evitar ataques DOS dirigidos expresamente a sobrecargar las consultas a la base de datos
- Es muy rápida y sencilla de utilizar! He visto buenos aportes en el foro que tienen la advertencia de que es necesario asegurar las variables para su uso real, ya que el compañero lo ha programado con prisas. Con esta función las prisas no deberían ser una escusa!
- Debería ser suficiente para la mayoría de ataques SQL Injection y XSS, recomendandose encarecidamente su uso conjuntamente con sentencias preparadas (PDO o MySQLi)
- Elimina espacios en blanco al principio y al final de la cadena, ya que no suelen tener utilidad.
¿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 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, 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
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
$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, 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!