mysql_real_escape_string

mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string -- Escapa caracteres especiales de una cadena para su uso en una sentencia SQL

Descripci贸n

string mysql_real_escape_string ( string cadena_no_escapada [, resource id_enlace] )

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.

Ejemplo 3. Una consulta "Recomendable"

Mediante el uso de mysql_real_escape_string() sobre cada variable se previene la inyecci贸n de SQL. Este ejemplo demuestra el m茅todo "recomendable" para ejecutar una consulta en la base de datos, independientemente del valor de las Comillas M谩gicas.

<?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.

Ver tambi茅n

mysql_client_encoding()
addslashes()
stripslashes()
La directiva magic_quotes_gpc
La directiva magic_quotes_runtime