mysql_query
mysql_result
MySQL Functions
PHP Manual

# 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 error is generated.

### Valores retornados

Devuelve la cadena escapada, o `FALSE` en caso de que ocurra un error.

### Ejemplos

Example #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));
?>`

Example #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'], ¡podría ser cualquier cosa que el usuario
// quiera! Por ejemplo:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Esto quiere decir que la consulta enviada a MySQL sería:
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.

Example #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
if (isset($_POST['nombre_producto']) && isset($_POST['descripcion_producto']) && isset($_POST['id_usuario'])) {
// Conectarse
$enlace = mysql_connect('host_mysql', 'usuario_mysql', 'contrasenya_mysql');
if(!is_resource($enlace)) {
echo "Falló la conexión con el servidor\n";
// ... registrar el error apropiadamente
} else {
// Revertir los efectos de magic_quotes_gpc/magic_quotes_sybase sobre las variables si es necesario.
if(get_magic_quotes_gpc()) {
$nombre_producto = stripslashes($_POST['nombre_producto']);
$descripcion_producto = stripslashes($_POST['descripcion_producto']);
} else {
$nombre_producto = $_POST['nombre_producto'];
$descripcion_producto = $_POST['descripcion_producto'];
}
// Hacer una consulta segura
$consulta = sprintf("INSERT INTO productos (`nombre`, `descripcion`, `id_usuario`) VALUES ('%s', '%s', %d)",
mysql_real_escape_string($nombre_producto, $enlace),
mysql_real_escape_string($descripcion_producto, $enlace),
$_POST['id_usuario']);
mysql_query($consulta, $enlace);
if (mysql_affected_rows($enlace) > 0) {
echo "Producto insertado\n";
}
}
} else {
echo "Llene los campos del formulario correctamente\n";
}
?>`

La consulta no se ejecutará correctamente ahora, y los ataques de inyección de SQL no funcionarán.

### Notes

> Note: 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.

> Note: 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.

> Note: Si esta función no es usada para escapar datos, la consulta es vulnerable a Ataques de Inyección de SQL.

> Note: 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() - Devuelve el nombre del juego de caracteres
- addslashes() - Escapa una cadena insertando barras "\"
- stripslashes() - Desmarca la cadena marcada con addslashes
- La directiva magic_quotes_gpc
- La directiva magic_quotes_runtime

mysql_query
mysql_result
MySQL Functions
PHP Manual