Función mysql_real_escape_string() de PHP

Definición y uso

La función mysql_real_escape_string() evita los caracteres especiales en las cadenas utilizadas en las sentencias SQL.

Los siguientes caracteres están afectados:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

Si tiene éxito, esta función devuelve la cadena evitada. Si falla, devuelve false.

Sintaxis

mysql_real_escape_string(string,connection)
Parámetros Descripción
string Obligatorio. Especificar la cadena que se debe evitar.
connection Opcional. Especificar la conexión MySQL. Si no se especifica, se usa la conexión anterior.

Descripción

Esta función string de caracteres especiales se evitan, teniendo en cuenta el conjunto de caracteres de la conexión actual, por lo que se puede usar de manera segura en mysql_query().

Consejos y comentarios

Consejo:Se puede usar esta función para prevenir ataques a la base de datos.

Ejemplo

Ejemplo 1

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('No se pudo conectar: ' . mysql_error());
  }
// Código para obtener el nombre de usuario y la contraseña
// Evitar la interpretación de los nombres de usuario y la contraseña para su uso en SQL
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
// Más códigos
mysql_close($con);
?>

Ejemplo 2

Ataque a la base de datos. Este ejemplo muestra lo que sucede si no aplicamos la función mysql_real_escape_string() a los nombres de usuario y contraseñas:

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('No se pudo conectar: ' . mysql_error());
  }
$sql = "SELECT * FROM users
WHERE user='{$_POST['user']}
AND password='{$_POST['pwd']}'";
mysql_query($sql);
// No verificar el nombre de usuario y la contraseña
// Puede ser cualquier contenido introducido por el usuario, por ejemplo:
$_POST['user'] = 'john';
$_POST['pwd'] = "' OR ''='";
// Algunos códigos...
mysql_close($con);
?>

Entonces, la consulta SQL se convertirá en esto:

SELECT * FROM users
WHERE user='john' AND password='' OR ''=''

Esto significa que cualquier usuario puede iniciar sesión sin ingresar una contraseña válida.

Ejemplo 3

La forma correcta de prevenir ataques a bases de datos:

<?php
function check_input($value)
{
// Eliminar barras invertidas
if (get_magic_quotes_gpc())
  {
  $value = stripslashes($value);
  }
// Si no es un número, agregar comillas
if (!is_numeric($value))
  {
  $value = "'" . mysql_real_escape_string($value) . "'";
  }
return $value;
}
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('No se pudo conectar: ' . mysql_error());
  }
// Realizar SQL seguro
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
?>