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); ?>