Funciones de MySQL
PHP Manual

mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_stringEscapa caracteres especiales en un string para su uso en una sentencia SQL

Advertencia

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro. En su lugar, deberían usarse las extensiones MySQLi o PDO_MySQL. Véase también la guía MySQL: elegir una API y P+F relacionadas para más información. Las alternativas a esta función incluyen:

Descripción

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )

Escapa caracteres especiales en el string dado 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

El string que va a ser escapado.

link_identifier

La conexión MySQL. Si el identificador de enlace no se especifica, el último enlace abierto por mysql_connect() es asumido. Si no se encuentra dicho enlace, la función intentará establecer un nuevo enlace como si mysql_connect() fuese invocado sin parámetros. Si no se encuentra o establece una conexión, un error de nivel E_WARNING es generado.

Valores devueltos

Devuelve un string escapado, o FALSE en caso de error.

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 Un ejemplo de ataque de inyección 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 magic_quotes_gpc está habilitado, primero se ha de aplicar stripslashes() a los datos. Si se usa esta función en datos que ya han sido escapados, se escaparán dos veces.

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.

Ver también


Funciones de MySQL
PHP Manual