Por desgracia las aplicaciones web no son seguras, nos guste o no, lo que hoy es seguro mañana no lo será. Alguién encontrará una forma de hacer añicos tu trabajo con una sucesión de carácteres a modo de exploid. Aprovechando aguna vulnerabilidad que por descuido o desconocimiento has dejado ahi, esperando a que nunca nadie la encuentre…
Para evitar que nunca nadie las encuentre, nuestro deber como desarrolladores es formarnos constantemente y estar al tanto de las nuevas mejoras y funcionalidades que van saliendo referente al lenguaje que estamos usando asiduamente. Quiero aportar un granito de arena recomendando esta forma de controlar nuestras peticiones a base de datos al puro estilo Google Gears.
sprintf(), protegiendo las peticiones
sprintf() es una función de php, (portada de C/C++) en la que podemos especificar el formato que ha de tener una cadena. Esta función nos permite hacer cosas como estas.
$sql = sprintf("SELECT nombre FROM tabla WHERE id = %d;",$numero);
mysql_query($sql);
De esta forma tan simple, estaremos indicando que la variable $sql, solo contendrá un número como parámetro para la consulta por id. Previamente a la utilización de $numero, deberemos tratarla para evitar que esto sea otra cosa que un número entero. En caso de pasarle un valor diferente a un entero la SQL dará un error de formateo al no reemplazar el valor.
Otros operadores
- % - un caracter de porcentaje literal. No requiere argumento.
- b - el argumento es tratado como un entero, presentado como un número binario.
- c - el argumento es tratado como un entero, y presentado como el caracter con ese valor ASCII.
- d - el argumento es tratado como un entero, y presentado como un número decimal (con signo).
- e - el argumento es tratado como notación científica (p.ej. 1.2e+2).
- u - el argumento es tratado como un entero, y presentado como un número decimal sin signo.
- f - el argumento es tratado como un flotante, y presentado como un número de punto flotante (teniendo en cuenta la localidad).
- F - el argumento es tratado como un flotante, y presentado como un número de punto flotante (no tiene en cuenta la localidad). Disponible desde PHP 4.3.10 y PHP 5.0.3.
- o - el argumento es tratado como un entero, y presentado como un número octal.
- s - el argumento es tratado y presentado como una cadena.
- x - el argumento es tratado como un entero y presentado como un número hexadecimal (con letras minúsculas).
- X - el argumento es tratado como un entero y presentado como un número hexadecimal (con letras mayúsculas).
Siguiendo la lógica
Siguiendo la lógica, ya que estamos tratando sprintf() deberíamos plantearnos desechar el polifacético echo() por printf(), de esta forma podríamos controlar la salida por pantalla al igual que en las peticiones a base de datos. El problema de usar estos métodos de forma exclusiva nos pone en el otro diléma que todo programador tiene que tener presente, el rendimiento.
Debido a sus mayores funcionalidades y opciones, sprintf(), printf(), … consumen mayor tiempo de procesador que echo() que únicamente muestra por pantalla. Por ello debemos tener presente donde usar estas funciones y donde usar otras.
Mi recomendación
Personalmente soy partidario de usar printf(), y sprintf() para todo lo referente a datos obtenidos de fuentes externas, ya sea un XML, una base de datos, otras webs,… así estaremos controlando lo único que es fácilmente alterable. Y para datos fijos, etiquetas, estructura,… usaremos echo() que aliviarán una pizca nuestro servidor.
Ampliando la seguridad
Además del uso de sprintf() y printf() tenemos a nuestra disponsición mysql_real_escape_string(), que se encarga de permitirnos validar esos parámetros sensibles de nuestros scripts. Veamos un ejemplo de como implementarlo.
$sql = sprintf("SELECT nombre FROM tabla WHERE id = %d;",mysql_real_escape_string($numero));
mysql_query($sql);




2 comentarios, 3 referencias
+
#