Escapa todos los caracteres especiales en la
cadena_no_escapada, tomando en cuenta el
juego de caracteres actual de la conexión, de tal modo que
sea seguro usarla con mysql_query(). Si se van a
insertar datos binarios, debe usarse esta función.
mysql_real_escape_string() llama a la
función de la biblioteca MySQL mysql_real_escape_string, la
cual coloca barras invertidas antes de los siguientes caracteres:
\x00, \n,
\r, \, ',
" y \x1a.
Esta función debe usarse siempre (con algunas excepciones)
para garantizar que los datos sean seguros antes de enviar una
consulta a MySQL
Lista de parámetros
cadena_no_escapada
La cadena a ser escapada.
link_identifier
The MySQL connection. If the
link identifier is not specified, the last link opened by
mysql_connect() is assumed. If no such link is found, it
will try to create one as if mysql_connect() was called
with no arguments. If by chance no connection is found or established, an
E_WARNING level warning is generated.
Valores retornados
Devuelve la cadena escapada, o FALSE en caso de que ocurra un
error.
Ejemplos
Ejemplo 1. Ejemplo sencillo de
mysql_real_escape_string()
<?php // Conectarse $enlace = mysql_connect('mysql_host', 'mysql_usuario', 'mysql_contrasenya') OR die(mysql_error());
// Consulta $query = sprintf("SELECT * FROM usuarios WHERE usuario='%s' AND password='%s'", mysql_real_escape_string($usuario), mysql_real_escape_string($password)); ?>
Ejemplo 2. Un ejemplo de un ataque de inyección SQL
<?php // Consultar la base de datos para verificar si hay una coincidencia de usuario $consulta = "SELECT * FROM usuarios WHERE usuario='{$_POST['username']}' AND password='{$_POST['password']}'"; mysql_query($consulta);
// No revisamos $_POST['password'], podria ser cualquier cosa que el usuario // quiera! Por ejemplo: $_POST['username'] = 'aidan'; $_POST['password'] = "' OR ''='";
// Esto quiere decir que la consulta enviada a MySQL seria: echo $consulta; ?>
La consulta enviada a MySQL:
SELECT * FROM usuarios WHERE usuario='aidan' AND password='' OR ''=''
Esto permitirÃa que cualquiera iniciara una sesión
sin una contraseña válida.
<?php // Aplicar comillas sobre la variable para hacerla segura function comillas_inteligentes($valor) { // Retirar las barras if (get_magic_quotes_gpc()) { $valor = stripslashes($valor); }
// Colocar comillas si no es entero if (!is_numeric($valor)) { $valor = "'" . mysql_real_escape_string($valor) . "'"; } return $valor; }
// Conexion $enlace = mysql_connect('mysql_host', 'mysql_usuario', 'mysql_contrasenya') OR die(mysql_error());
// Realizar una consulta segura $consulta = sprintf("SELECT * FROM usuarios WHERE usuario=%s AND password=%s", comillas_inteligentes($_POST['username']), comillas_inteligentes($_POST['password']));
mysql_query($consulta); ?>
La consulta no se ejecutará correctamente ahora, y los
ataques de inyección de SQL no funcionarán.
Notes
Nota:
Es necesaria una conexión MySQL antes de usar
mysql_real_escape_string() o de lo contrario un
error de nivel E_WARNING es generado, y FALSE
es devuelto. Si id_enlace no está
definido, se usará la última conexión con
MySQL.
Nota:
Si se habilita magic_quotes_gpc, aplique
stripslashes() sobre los datos primero. Usar
esta función sobre datos que ya han sido escapados los
escapará dos veces.
Nota:
Si esta función no es usada para escapar datos, la consulta
es vulnerable a Ataques de
Inyección de SQL.
Nota: mysql_real_escape_string() no escapa
% ni _. Éstos son
comodines en MySQL si se combinan con LIKE,
GRANT, o REVOKE.
Atención técnica y comercial: (54)-11-5031-1111 las 24 hs. los 365 días del año. ToWebs, (c) 2008
Virtucom Networks S.A Av. Belgrano 1586, piso 10 (C1093AAQ) Cap. Fed. Bs. As, Argentina.