mysql_real_escape_string
(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string — Escapa caracteres especiales en una cadena para su uso en una sentencia SQL
Advertencia
Esta extensión
estaba obsoleta en PHP 5.5.0, y fue eliminada en PHP 7.0.0. En su lugar, se puede
utilizar la extensión MySQLi o la extensión
PDO_MySQL. Ver también
MySQL: elegir una API de la guía.
Alternativas a esta función:
Descripción
Escapa caracteres especiales en la cadena dada por unescaped_string,
teniendo en cuenta el conjunto de caracteres en uso de la conexión, para que
sea seguro usarla en mysql_query(). Si se van a insertar
datos binarios, se ha de usar esta función.
mysql_real_escape_string() llama a la función mysql_real_escape_string
de la biblioteca de MySQL, la cual antepone barras invertidas a los siguientes caracteres:
\x00, \n,
\r, \, ',
" y \x1a.
Esta función siempre debe usarse (con pocas excepciones) para hacer seguros
los datos antes de enviar una consulta a MySQL.
Precaución
Seguridad: el conjunto de caracters predeterminado
El conjunto de caracteres debe ser establecido o bien a nivel del servidor, o bien con
la función mysql_set_charset() de la API para que afecte a
mysql_real_escape_string(). Véase la sección sobre los conceptos
de conjuntos de caracters para
más información.
Parámetros
unescaped_string
-
La cadena a escapar.
link_identifier
La conexión MySQL.
Si no se especifica, se utilizará la última conexión abierta con la función
mysql_connect(). Si no se encuentra una conexión de este tipo,
la función intentará abrir una conexión, como si la función mysql_connect() hubiera sido llamada sin argumento.
Si no se encuentra o establece una conexión, se generará una alerta de nivel
E_WARNING.
Valores devueltos
Devuelve la cadena escapada, o false en caso de error.
Errores/Excepciones
Ejecutar esta función sin una conexión de MySQL presente también
emitirá errores de nivel E_WARNING de PHP. Solo
se ha de ejecutar con una conexión de MySQL válida presente.
Ejemplos
Ejemplo #1 Ejemplo sencillo de mysql_real_escape_string()
<?php
// Conexión
$enlace = mysql_connect('anfitrión_mysql', 'usuario_mysql', 'contraseña_mysql')
OR die(mysql_error());
// Consulta
$consulta = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($usuario),
mysql_real_escape_string($contraseña));
?>
Ejemplo #2 mysql_real_escape_string() requiere una conexión
Este ejemplo muestra lo que sucede si no hay presente una conexión
de MySQL al invocar a esta función.
<?php
// No nos hemos conectado a MySQL
$apellido = "O'Reilly";
$_apellido = mysql_real_escape_string($apellido);
$consulta = "SELECT * FROM actors WHERE last_name = '$_apellido'";
var_dump($_apellido);
var_dump($consulta);
?>
Resultado del ejemplo anterior es similar a:
Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5
Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5
bool(false)
string(41) "SELECT * FROM actors WHERE last_name = ''"
Ejemplo #3 Un ejemplo de ataque de inyección de SQL
<?php
// No hemos comprobado $_POST['password'], ¡podría ser cualquier cosa que el usuario quisiera! Por ejemplo:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Consultar la base de datos para comprobar si existe algún usuario que coincida
$consulta = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($consulta);
// Esto significa que la consulta enviada a MySQL sería:
echo $consulta;
?>
La consulta enviada a MySQL:
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
Esto permitiría a alguien acceder a una sesión sin una contraseña válida.
Notas
Nota:
Se requiere una conexión a MySQL antes de usar
mysql_real_escape_string(), si no, se generará
un error de nivel E_WARNING, y se devolverá false.
Si link_identifier no está definido, se
usará la última conexión a MySQL.
Nota:
Si esta función no se utiliza para escapar los datos, la consulta es vulnerable a
Ataques de inyección SQL.
Nota:
mysql_real_escape_string() no escapa
% ni _. Estos son comodines en
MySQL si se combinan con LIKE, GRANT,
o REVOKE.