Buscar en este blog

miércoles, 19 de diciembre de 2007

PHP. Evitar inyección de código.

Por un campo input un usuario puede introducir código que puede ser interpretado en el servidor sino tenemos cuidado.

La función php addslashes( string ) devuelve un string con los carateres escapados, es muy utilizada para escapar los caracteres en las sentencias SQL.

Ver su descripción en www.php.net

Otras formas de evitar que se inyecte código por los input de un formulario sería validar lo que se envía al servidor, las expresiones regulares nos pueden ayudar mucho. Evitamos que se los valores tengan caracteres especiales.

// si tiene algún caracter especial, _.!@#$&*+=|.....
if (ereg("[^A-Za-z0-9]+",$_REQUEST['user'])) {
$_MensajeError="ERROR: usuario no válido";

return $_MensajeError;
}
// si no tiene caracteres alfanuméricos
if (ereg("[^A-Za-z0-9]+",$_REQUEST['pass'])) {
$_MensajeError="ERROR: password no válida";

return $_MensajeError;
}
?>


El tema de la seguridad es muy amplio, con esto solo prevenimos ciertos ataques, por ello deberemos añadir a nuestros scripts muchísimos más controles para tener una web segura.

3 comentarios:

mugedoc dijo...

También una forma sencilla es escapar las comillas simples.

Todos los parametros de un INSERT, UPATE, SELECT, etc .. deberán ser escapados al montar la sentencia, antes de ejecutarla.

En oracle sustiutimos la comilla simple ' por dos comillas simples '' que no es lo mismo que dobles comillas ".

En mysql con escapar la comilla simple con \' bastaría para evitar la inyecciónd e código.

artemisa dijo...

Hola, disculpa, podrias explicarme un poquito a que te refieres con "escapar las comillas simples" para lo de mysql? Muchisimas gracias.

mugedoc dijo...

El artículo está un poco anticuado, más bien obsoleto.

Para escapar los caracteres usar en mysql:
mysql_real_escape_string


Para validar los campos ereg está obsoleta, usar preg_match

preg_match




# VALIDACIÓN

// El usuario debe tener entre 4 o 20 caracteres y solo son válidos letras, números, el punto . y guión bajo y medio _ -
if (!preg_match('/^[a-z0-9_.-]{4,20}$/i', $_REQUEST['user'])) {
$errorMensaje="ERROR: usuario no válido";
return $errorMensaje;
}

// Otra forma sería, si tiene algún caracter que no sea letras, números, el punto . y guión bajo y medio _ -, error
if (preg_match('/[^a-zA-Z_\-\.]+/', $_REQUEST['user'])) {
$errorMensaje="ERROR: usuario no válido";
return $errorMensaje;
}


# ESCAPAR CARACTERES en MYSQL

$query = sprintf("SELECT * FROM users
WHERE user='%s' AND password='%s'",
mysql_real_escape_string($_REQUEST['user']),
mysql_real_escape_string($_REQUEST['password']));

$result = mysql_query($query);