Mecanismos de protección contra inyección sql

Post on 14-Nov-2014

3.030 views 1 download

Tags:

description

 

Transcript of Mecanismos de protección contra inyección sql

Es un método de infiltración de código intruso

que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos.

INYECCION SQL

<?php $user = $GET['login']; $pass = $GET['password'];

$query = "SELECT * FROM users WHERE username='" . $user . "'and userpass='" . $pass . "'";

$conexionpg_connect("dbname=webapp user=usuario");$result = pg_query($conexion, $consulta);if($result) {$rows = pg_num_rows($result);if($rows == 0) {?><h1><?php echo "Acceso denegado";?></h1><?php}else{?><h1><?php echo "Bienvenido" . $user;?></h1> <?php} }?>}?>

login

password

SELECT * FROM users WHERE username='.$user.'and userpass='.$pass';

login

password itcuautla

martha

Si en los campos user y pass de nuestra aplicación ponemos:username =marthauserpass = itcuautlala consulta quedaría:

SELECT * FROM users WHERE username=‘martha‘ and userpass=‘itcuautla';

login

password  ‘OR”=’

 ‘OR”=’

SELECT * FROM users WHERE username='' OR ''=''and userpass='' OR ''='';

login

password  ‘;DROP TABLE users;–

loquesea

SELECT * FROM users WHERE username='loquesea' and userpass='';DROP TABLE users;--';

Ocurre por que no filtramos o escapamos los

carácteres que forman la sintaxis de sql, no se filtran las comillas simples (‘), el punto y coma(;), los iguales (=) ni los guiones (-).

¿Por qué ocurre esto?

Aplicar validación (lo más estricta posible) a

los datos. Que no se pueda ejecutar más de una

sentencia SQL en el mismo comando. Restringir los tipos de dato aceptados. Utilizar funciones ya preparadas para realizar

el trabajo con la BD. Escapar el caracter (‘).

Solución

<?php $user = $GET['login']; $pass = $GET['password'];if(ereg("^[0-9A-Za-z]+$",$user)) && (ereg("^[0-9A-Za-z]+$",$pass)) {$query = "SELECT * FROM users WHERE

username='".pg_escape_string($user)."'and userpass='".pg_escape_string($pass)."'“ $conexion = pg_connect("dbname=webapp user=usuario");

$result = pg_query($conexion, $consulta);if($result) {

$rows = pg_num_rows($result);if($rows == 0) {?&>

<h1><?php echo "Acceso denegado";?></h1><?php}else{?>

<h1><?php echo "Bienvenido".$user;?></h1><?php}} }?>

<?php $user = $GET['login'];$pass = $GET['password'];

if(ereg("^[0-9A-Za-z]+$",$user)) && (ereg("^[0-9A-Za-z]+$",$pass)) {$conexion = pg_connect("dbname=webapp user=usuario");$result = pg_prepare($conexion, "", 'SELECT * FROM users WHERE username =$1 and userpass=$2');$resultexec = pg_execute($conexion, "", array($user,$pass));if($resultexec) {$rows = pg_num_rows($resultexec);if($rows == 0) {?&><h1><?php echo "Acceso denegado";?></h1><?php}else{?><h1><?php echo "Bienvenido".$user;?></h1><?php}

}}?>