Eliminando SQL injection

Post on 13-Jun-2015

2.783 views 0 download

Tags:

description

Conferencia que di para OWASP Guatemala sobre SQL injection en PHP y como eliminar ese problema de seguridad el cual es el número uno del Top10 según OWASP.

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 Maphpiasrodriguez@maphpia.com

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'] = “foo@bar.com');

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', 'foo@bar.com');

DROP TABLE users;

-- ');

7OWASP

¿Qué es SQL injection?

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com');

DROP TABLE users;

-- ');

8OWASP

¿Qué es SQL injection?

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com');

DROP TABLE users;

-- ');

9OWASP

¿Qué es SQL injection?

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com');

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'] = “foo@bar.com');

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', 'foo@bar.com');

DROP TABLE users;

-- ');

18OWASP

Como solucionar problemas de SQL injection

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com\');

DROP TABLE users;

-- ');

19OWASP

Como ELIMINAR problemas de SQL injection

PDO...

20OWASP

Como ELIMINAR problemas de SQL injection

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com\');

DROP TABLE users;

-- ');

21OWASP

Como ELIMINAR problemas de SQL injection

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com\');

DROP TABLE users;

-- ');

22OWASP

Como ELIMINAR problemas de SQL injection

$_POST['email'] = “foo@bar.com');

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', 'foo@bar.com\');

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'] = “foo@bar.com');

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'] = “foo@bar.com');

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', 'foo@bar.com\');

DROP TABLE users;

-- ');

27OWASP

Ir un paso mas allá.

$_POST['email'] = “foo@bar.com');

DROP TABLE users;

-- ”;

$user = new User();

$user->insert($_POST);

INSERT INTO USERS (username, password, email)

VALUES ('str', 'password', 'foo@bar.com\');

DROP TABLE users;

-- ');

28OWASP

Eliminando SQL injection

GRACIASStuardo -StR- Rodríguezsrodriguez@maphpia.com /in/stuardo http://www.google.com/profiles/stuardo.str