03 octubre 2007

Cuestiones de seguridad con php

En este foro recopilan 14 cuestiones sobre seguridad que se deberían tener en cuenta para crear un sitio web.

http://webmaster-forums.code-head.com/showthread.php?t=939

Algunas de ellas:

1. Por ejemplo, si estamos esperando un número entero para un campo utilizaremos la función intval para asegurarnos de que el valor es un entero antes de hacer cosas peligrosas con el. El código sería algo así:
$post_id = intval($_GET['post_id']);
mysql_query("SELECT * FROM post WHERE id = $post_id");
De este modo la consulta no hará cosas raras.

2. Obvia, nunca realizar la autenticación de usuarios del lado del cliente con javascript, siempre hacerlo del lado del servidor con php. Esta es fácil de seguir.

3. Nunca enviar a una base de datos una cadena introducida por el usuario, siempre escapar los caracteres mediante la función mysql_real_escape_string(). Esta es importante. En el foro se propone el uso de una función de este tipo:
function escape($values) {
if(
is_array($values)) {
$values = array_map(array(&$this, 'escape'), $values);
} else {
/* Quote if not integer */
if ( !is_numeric($values) || $values{0} == '0' ) {
$values = "'" .mysql_real_escape_string($values) . "'";
}
}
return
$values;
}
4. En las consultas, si tenemos un campo entero, no ponerlo entre comillas (para evitar que sea un literal, entiendo). Y aquí está el motivo:

$id = "0; DELETE FROM users";
$id = mysql_real_escape_string($id); // 0; DELETE FROM users - mysql_real_escape_string doesn't escape ;
mysql_query("SELECT * FROM users WHERE id='$id'");

Si esto llegase al servidor eliminaría los datos además de realizar la consulta.

5. Siempre escapar la salida para evitar Cross Site Scripting.

....y así hasta 14. Merece la pena echarle un vistazo, al igual que el resto de los foros de Codehead.

2 comentarios:

johan castillo dijo...

muy buenos consejos

Antonio dijo...

Muchas gracias.