La inyección SQL consiste en la modificación de las consultas a nuestra base de datos a partir de los parametros pasados por URL al script en PHP.
¿En que consiste?
Vamos a ver un ejemplo de lo que es la inyección, imaginemos que para validar el acceso de un usuario registrado utilizamos la siguiente consulta SQL:
<?
$sql = "SELECT * FROM usr WHERE id = '" . $id ;
$sql .= "' AND pwd = '" . $pwd . "'" ;
?>
Cuando tengamos unos valores para el nombre de usuario (id) y la contraseña del usuario (pwd) tendremos una consulta normal a la base de datos que nos devolverá los datos del usuario si la contraseña es correcta:
SELECT * FROM usr WHERE id = 'root' AND pwd = '4358'
Pero vamos a ver que pasaria si intentaramos modificar la consulta poniendo cómo contraseña ' OR '' = 'SELECT * FROM usr WHERE id = 'root' AND pwd = ' ' OR '' = ' '
En este caso, como '' siempre es igual a '', habremos modificado la consulta para que nos devuelva siempre los datos del usuario aunque la contraseña sea incorrecta, y el visitante malintencionado se podrá conectar como cualquier usuario.prueba.php
<?
if(!isset( $_GET [ "inyeccion" ])){
header ( "location: ?inyeccion='" );
} else {
echo 'Tu servidor ' ;
if( $_GET [ "inyeccion" ] != "'" )echo 'no ' ;
echo 'tiene problemas de inyección' ;
}
?>
Segun el mensaje que nos muestre deberemos o no preocuparnos.
¿Que debo hacer?
En el caso de que tu servidor haya dado resultado positivo, será porque no se preocupa de cambiar la comilla simple por ' , y en este caso, deberemos ser nosotros los que manualmente lo cambiemos de todas las variables pasadas tanto por URL como vía formulario:
inyeccion.php
<?
// Evitamos la inyeccion SQL
// Modificamos las variables pasadas por URL
foreach( $_GET as $variable => $valor ){
$_GET [ $variable ] = str_replace ( "'" , "'" , $_GET [ $variable ]);
}
// Modificamos las variables de formularios
foreach( $_POST as $variable => $valor ){
$_POST [ $variable ] = str_replace ( "'" , "'" , $_POST [ $variable ]);
}
?>
Y incluiremos este script en todas las páginas en las que realizemos consultas a la base de datos:
<?
// Evitamos la inyeccion SQL
include 'inyeccion.php' ;
//
// Contenido de la página PHP
//
?>
De esta manera conseguiremos hacer consultas a la base de datos desde PHP de forma más segura, vean cómo si incluyen este archivo en la página de prueba, les dirá que el servidor es seguro ;)
Artículo por cortesía de Eloi de San Martín
www.programacionweb.net
Usuarios que han visto este tema también han visto...
- Manejo de cadenas en PHP
- Convertir campo de fecha en formato europeo
- Como alternar los colores de las filas de una tabla con PHP
- Manejo de errores en PHP
- Instalación de PHPMyAdmin
Información legal | Política de Privacidad | Contacte con nosotros
Otro proyecto de Factoría de Internet. Copyright© 2003-2011 Factoría de Internet S.L.. Todos los derechos reservados.