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\"";
¿Cómo funciona exactamente? ¿Cómo evita esto el ataque? – locoboy
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. –
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