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.
2. ¿Quién soy?
Stuardo Rodríguez
Promotor del software libre desde 1998
Desarollador web en PHP desde 2000
Fundador comunidad PHPGT
/in/stuardo
http://www.google.com/profiles/stuardo.str
Actualmente trabajando para La Maphpia
OWASP 2
3. Eliminando SQL injection
Agenda
3 categorías de posible inseguridad
¿Qué es SQL injection?
Como solucionar problemas de SQL injection
Como ELIMINAR problemas de SQL injection
Ir un paso mas allá.
OWASP 3
4. 3 categorías de posible inseguridad
Datos de entrada
Datos de salida
Entorno
entrada sistema salida
OWASP 4
5. 3 categorías de posible inseguridad
Datos de entrada
Datos de salida
Entorno
entrada sistema salida
OWASP 5
6. ¿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;
-- ');
OWASP 6
7. ¿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;
-- ');
OWASP 7
8. ¿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;
-- ');
OWASP 8
9. ¿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;
-- ');
OWASP 9
10. Como solucionar
problemas de SQL injection
Método automático
magic_quotes
Existe desde PHP2
Creado para “ayudar” a programadores novatos a
escribir código “seguro”
Escapeaba con cualquier ',”, o caracter NULL.
OWASP 10
11. Como solucionar
problemas de SQL injection
Método automático
magic_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 '
OWASP 11
12. Como solucionar
problemas de SQL injection
Método automático
magic_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!
OWASP 12
13. Como solucionar
problemas de SQL injection
Método automático
filter_input()
filter_var()
filter_input_array()
filter_var_array()
OWASP 13
14. Como solucionar
problemas de SQL injection
Método automático
filter_input()
filter_var()
filter_input_array()
filter_var_array()
SIGEN GENERANDO IGNORANCIA!
OWASP 14
15. Como solucionar
problemas de SQL injection
Método manual
if (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');
OWASP 15
16. Como solucionar
problemas de SQL injection
Método manual
mysql_escape_string()
mysql_real_escape_string()
OWASP 16
17. 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;
-- ');
OWASP 17
18. 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;
-- ');
OWASP 18