2011-06-13 80 views
36

Una cosa que odio sobre la documentación a veces (cuando eres un principiante) es cómo realmente no describe las cosas en inglés. ¿Le importaría a alguien traducir esta documentación por mí? Me gustaría saber cómo exactamente esto hace que sea más difícil para un hacker insertar caracteres.¿qué hace mysql_real_escape_string() realmente?

http://php.net/manual/en/function.mysql-real-escape-string.php

Además, si este es el caso, ¿cómo un hacker intenta insertar caracteres?

Respuesta

58

La función agrega un carácter de escape, la barra invertida, \, antes de que ciertos caracteres potencialmente peligrosos de una cadena pasen a la función. Los caracteres de escape son

\ x00 \ n \ r, \,', "y \ X1A.

Esto puede ayudar a prevenir ataques de inyección SQL que a menudo se llevan a cabo utilizando el" carácter para añadir código malicioso en una consulta SQL.

+0

¿Cómo funciona exactamente? ¿Cómo evita esto el ataque? – locoboy

+2

Lea sobre inyección SQL - http://www.unixwiz.net/techtips/sql-injection.html. Como dije en mi respuesta, la función funciona escapando caracteres que pueden provocar la ejecución de código malicioso. –

+1

Entonces leo parte del enlace, pero parece que la inyección es solo una parte de la cadena que se envía. ¿Cómo evita Mysql_real_escape_string este ataque? ¿Simplemente pone un \ antes de todo? – locoboy

3

El mysql_real_escape_string() ayuda a escapar caracteres especiales como única etc cita que los usuarios pueden enviar a su script. usted necesita para escapar de esos personajes porque eso resulta conveniente cuando se desea evitar SQL Injection

Te gustaría sugggest de revisar:

mysql_real_escape_string() versus Prepared Statements

Ser lado en mucho más seguro, tiene que ir a por sentencias preparadas lugar como se ha demostrado a través del artículo anterior.

+1

Este artículo simplemente pasó por alto el punto que [no deberías usar 'SET CHARACTER SET' pero' mysql_set_charset'] (http://stackoverflow.com/questions/5288953/is-mysql-real-escape-string-broken/5289141#5289141). – Gumbo

6

Mejor explicado aquí.

http://www.w3schools.com/php/func_mysql_real_escape_string.asp

http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

Por lo general, ayuda a evitar la inyección de SQL, por ejemplo, considere el siguiente código:

<?php 
// Query database to check if there are any matching users 
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'"; 
mysql_query($query); 

// We didn't check $_POST['password'], it could be anything the user wanted! For example: 
$_POST['username'] = 'aidan'; 
$_POST['password'] = "' OR ''='"; 

// This means the query sent to MySQL would be: 
echo $query; 
?> 

y un hacker puede enviar una consulta como:

SELECT * FROM usuarios WHERE user = 'Aidan' y la contraseña = '' O '' = ''

Esto permitiría que cualquiera pueda iniciar la sesión sin una contraseña válida.

8

PHP mysql_real_escape_string function es solo un contenedor para MySQL’s mysql_real_escape_string function. Básicamente prepara la cadena de entrada para ser utilizada de manera segura en un MySQL string declaration escapando ciertos caracteres para que no puedan ser malinterpretados como un delimitador de cadena o un delimitador de secuencia de escape y así permitir certain injection attacks.

La verdadera en mysql_real_escape_string en frente a mysql_escape_string se debe al hecho de que también lleva la codificación de caracteres actual en cuenta que los caracteres de riesgo no están codificados por igual en las diferentes codificaciones de caracteres. Pero necesita specify the character encoding change properly para que mysql_real_escape_string funcione correctamente.

38

Supongamos que desea guardar la cadena I'm a "foobar" en la base de datos.
Su consulta se verá algo así como INSERT INTO foos (text) VALUES ("$text").
Con la variable $text reemplazado, esto va a tener este aspecto:

INSERT INTO foos (text) VALUES ("I'm a "foobar"") 

Ahora, exactamente donde termina la cadena? Usted sabe, un analizador de SQL no lo hace. Esto no solo interrumpirá esta consulta, sino que también se puede abusar para inyectar comandos SQL que no pretendías.

mysql_real_escape_string se asegura de tales ambigüedades no se producen por escapar caracteres que tienen un significado especial para un analizador de SQL:

mysql_real_escape_string($text) => I\'m a \"foobar\" 

esto se convierte en:

INSERT INTO foos (text) VALUES ("I\'m a \"foobar\"") 

Esto hace que la declaración inequívoca y seguro. El \ indica que el siguiente carácter no debe tomarse por su significado especial como terminador de cadena. Hay algunos de esos personajes que se ocupa de mysql_real_escape_string.

El escape es algo bastante universal en lenguajes de programación por cierto, todo en la misma línea. Si desea escribir la frase anterior, literalmente, en PHP, lo que necesita para escapar de ella, así por las mismas razones:

$text = 'I\'m a "foobar"'; 
// or 
$text = "I'm a \"foobar\""; 
0

La función mysqli_real_escape_string() escapa caracteres especiales de una cadena para su uso en una instrucción SQL.

Cuestiones relacionadas