
Al momento de desarrollar una aplicación con base de datos, se debe tomar en cuenta la seguridad del mismo, uno de los ataques más comunes es el sql injection que consta básicamente de introducir código sql en cajas de texto de nuestro sistema con el fin de introducirse ó sacar información.
Un ejemplo de sql injection sería el siguiente:
<?php
// Consultar la base de datos para verificar si hay una coincidencia de usuario
$consulta = "SELECT * FROM usuarios WHERE usuario='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($consulta);
//Supongamos que el usuario tecleó ' OR ''=' en el campo de password:
$_POST['username'] = 'admin';
$_POST['password'] = "' OR ''='";
// Esto quiere decir que la consulta enviada a MySQL seria:
echo $consulta;
?>
La variable $consulta contendría:
SELECT * FROM usuarios WHERE usuario='aidan' AND password='' OR ''=''
Esto permitiría a cualquier usuario ingresar al sistema sin password.
Para realizar una consulta segura, utilizaremos 2 funciones mysql_real_escape_string y sprintf, se pudiera resolver también modificando la configuración del php para no permitir caracteres especiales, pero ésto sería una desventaja, ya que no permitiría la portabilidad del código.
<?php
// Conexion
$enlace = mysql_connect('mysql_host', 'mysql_usuario', 'mysql_contraseña')
OR die(mysql_error());
//Consulta segura
$query = sprintf("SELECT * FROM libros WHERE autor='%s'", mysql_real_escape_string($autor_nombre));
mysql_query($query);
?>
Ojo, si no hay una conexión con el servidor, la función mysql_rea_space_string marcará un error.
En caso de una consulta de logeo:
<?php
// Función para eliminar "/" y añadir comillas
function comillas_inteligentes($valor)
{
// Retirar las barras
if (get_magic_quotes_gpc()) {
$valor = stripslashes($valor);
}
// Colocar comillas si no es entero
if (!is_numeric($valor)) {
$valor = "'" . mysql_real_escape_string($valor) . "'";
}
return $valor;
}
// Conexion
$enlace = mysql_connect('mysql_host', 'mysql_usuario', 'mysql_contraseña')
OR die(mysql_error());
//consulta segura
$consulta = sprintf("SELECT * FROM usuarios WHERE usuario=%s AND password=%s",
comillas_inteligentes($_POST['username']),
comillas_inteligentes($_POST['password']));
mysql_query($consulta);
?>
May 22, 2009 | Etiquetado en: | 1 Comment RSS feed para los comentarios de esta entrada. TrackBack URI
Todos los derechos reservados. Tecnologia.
Esta mejor ‘or’
Comentario por Rafael Bucio — May 25, 2009 #