Eliminando SQL injection
-
Upload
stuardo-rodriguez -
Category
Technology
-
view
2.783 -
download
0
description
Transcript of Eliminando SQL injection
Copyright © The OWASP FoundationPermission is granted to copy, distribute and/or modify this document under the terms of the OWASP License.
The OWASP Foundation
OWASP
Eliminando SQL injection
Stuardo -StR- RodríguezWeb developerLa [email protected]
19/08/2011
2OWASP
¿Quién soy?
Stuardo RodríguezPromotor del software libre desde 1998Desarollador web en PHP desde 2000Fundador comunidad PHPGT /in/stuardo http://www.google.com/profiles/stuardo.strActualmente trabajando para La Maphpia
3OWASP
Eliminando SQL injection
Agenda3 categorías de posible inseguridad¿Qué es SQL injection?Como solucionar problemas de SQL injectionComo ELIMINAR problemas de SQL injectionIr un paso mas allá.
4OWASP
3 categorías de posible inseguridad
Datos de entradaDatos de salidaEntorno
sistemaentrada salida
5OWASP
3 categorías de posible inseguridad
Datos de entradaDatos de salidaEntorno
sistemaentrada salida
6OWASP
¿Qué es SQL injection?
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = “INSERT INTO users (username, password, email) VALUES (
'{$_POST['username']}',
'{$_POST['pass']}',
'{$_POST['email']}'
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]');
DROP TABLE users;
-- ');
7OWASP
¿Qué es SQL injection?
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = “INSERT INTO users (username, password, email) VALUES (
'{$_POST['username']}',
'{$_POST['pass']}',
'{$_POST['email']}'
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]');
DROP TABLE users;
-- ');
8OWASP
¿Qué es SQL injection?
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = “INSERT INTO users (username, password, email) VALUES (
'{$_POST['username']}',
'{$_POST['pass']}',
'{$_POST['email']}'
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]');
DROP TABLE users;
-- ');
9OWASP
¿Qué es SQL injection?
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = “INSERT INTO users (username, password, email) VALUES (
'{$_POST['username']}',
'{$_POST['pass']}',
'{$_POST['email']}'
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]');
DROP TABLE users;
-- ');
10OWASP
Como solucionar problemas de SQL injection
Método automáticomagic_quotes
Existe desde PHP2 Creado para “ayudar” a programadores novatos a
escribir código “seguro” Escapeaba con \ cualquier ',”,\ o caracter NULL.
11OWASP
Como solucionar problemas de SQL injection
Método automáticomagic_quotes
No todos los datos de entrada son para ser insertados en SQL.
No todos los datos a ser insertados vienen en un campo del formulario.
magic_quotes usa addslashes() que no es seguro para escapar texto unicode.
No todas las bases de datos usan \ para escapear '
12OWASP
Como solucionar problemas de SQL injection
Método automáticomagic_quotes
No todos los datos de entrada son para ser insertados en SQL.
No todos los datos a ser insertados vienen en un campo del formulario.
magic_quotes usa addslashes() que no es seguro para escapar texto unicode.
No todas las bases de datos usan \ para escapear ' GENERA IGNORANCIA!
13OWASP
Como solucionar problemas de SQL injection
Método automáticofilter_input()filter_var()filter_input_array()filter_var_array()
14OWASP
Como solucionar problemas de SQL injection
Método automáticofilter_input()filter_var()filter_input_array()filter_var_array()
SIGEN GENERANDO IGNORANCIA!
15OWASP
Como solucionar problemas de SQL injection
Método manualif (strpos($_POST['email'], ';'))
throw new Exception('Invalid input');
if (strpos($_POST['email'], '\''))
throw new Exception('Invalid input');
if (strpos($_POST['email'], '”'))
throw new Exception('Invalid input');
if (preg_match('/from|select|delete|insert|where|drop|show|#|--|/ui',$_POST['email']))
throw new Exception('Invalid input');
16OWASP
Como solucionar problemas de SQL injection
Método manualmysql_escape_string()mysql_real_escape_string()
17OWASP
Como solucionar problemas de SQL injection
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = “INSERT INTO users (username, password, email) VALUES (
'{$_POST['username']}',
'{$_POST['pass']}',
'{$_POST['email']}'
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]');
DROP TABLE users;
-- ');
18OWASP
Como solucionar problemas de SQL injection
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = sprintf(“INSERT INTO users (username, password, email) VALUES ('%s', '%s', '%s')”,
mysql_real_escape_string($_POST['username']),
mysql_real_escape_string($_POST['pass']),
mysql_real_escape_string($_POST['email'])
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]\');
DROP TABLE users;
-- ');
19OWASP
Como ELIMINAR problemas de SQL injection
PDO...
20OWASP
Como ELIMINAR problemas de SQL injection
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = sprintf(“INSERT INTO users (username, password, email) VALUES ('%s', '%s', '%s')”,
mysql_real_escape_string($_POST['username']),
mysql_real_escape_string($_POST['pass']),
mysql_real_escape_string($_POST['email'])
)”;
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]\');
DROP TABLE users;
-- ');
21OWASP
Como ELIMINAR problemas de SQL injection
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = $db->prepare('INSERT INTO users
(username, password, email)
VALUES (:username, :pass, :email)');
$sql->exec($_POST);
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]\');
DROP TABLE users;
-- ');
22OWASP
Como ELIMINAR problemas de SQL injection
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = $db->prepare('INSERT INTO users
(username, password, email)
VALUES (:username, :pass, :email)');
$sql->exec($_POST);
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]\');
DROP TABLE users;
-- ');
23OWASP
Como ELIMINAR problemas de SQL injection
PDOMódulo PECL para PHP 5.0Nace de DB y MDB de PEARPor default en PHP 5.1
24OWASP
Como ELIMINAR problemas de SQL injection
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$db = new PDO('mysql:host=localhost;
dbname=example', $user, $password);
$sql = $db->prepare('INSERT INTO users
(username, password, email)
VALUES (:username, :pass, :email)');
$sql->exec($_POST);
25OWASP
Ir un paso mas allá.
PDO es una capa de abstracción de acceso a datos
Usar una capa de abstracción de datosDoctrine
26OWASP
Ir un paso mas allá.
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$sql = $db->prepare('INSERT INTO users
(username, password, email)
VALUES (:username, :pass, :email)');
$sql->exec($_POST);
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]\');
DROP TABLE users;
-- ');
27OWASP
Ir un paso mas allá.
$_POST['email'] = “[email protected]');
DROP TABLE users;
-- ”;
$user = new User();
$user->insert($_POST);
INSERT INTO USERS (username, password, email)
VALUES ('str', 'password', '[email protected]\');
DROP TABLE users;
-- ');
28OWASP
Eliminando SQL injection
GRACIASStuardo -StR- Rodrí[email protected] /in/stuardo http://www.google.com/profiles/stuardo.str