Mecanismos de protección contra inyección sql
-
Upload
alejandra-toledano -
Category
Education
-
view
3.029 -
download
1
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}
}}?>