¿Qué significa escapar de una cadena?

84

Estaba leyendo ¿Es necesario escapar $ _SESSION ['username'] antes de ingresar a una consulta SQL? y decía "Necesita escapar de cada cadena que pase a la consulta SQL, independientemente de su origen". Ahora sé que algo como esto es realmente básico. Una búsqueda en Google arrojó más de 20 000 resultados. Stackoverflow solo tuvo 20 páginas de resultados, pero nadie realmente explica qué es escapar de una cadena o cómo hacerlo. Simplemente se asume. ¿Me puedes ayudar? Quiero aprender porque como siempre estoy haciendo una aplicación web en PHP.

He mirado: Insertar caracteres de escape , ¿Cuáles son todos los caracteres de escape en Java? , No se puede escapar de una cadena con addcslashes () , carácter de escape , ¿qué hace realmente mysql_real_escape_string ()? , ¿Cómo puedo escapar de las comillas dobles de una cadena en php? , MySQL_real_escape_string no agrega barras? , elimine las secuencias de escape de la cadena en php . Podría continuar, pero estoy seguro de que entiende el punto. Esto no es pereza.

Brett
fuente
10
PD: Podría haberle preguntado a un amigo y no hacer el ridículo, pero pensé que habría mucha gente como yo preguntándose de qué se trataba todo el mundo.
Brett

Respuestas:

136

Escapar de una cadena significa reducir la ambigüedad entre las comillas (y otros caracteres) utilizados en esa cadena. Por ejemplo, cuando está definiendo una cadena, normalmente la escribe entre comillas dobles o simples:

"Hello World."

Pero, ¿y si mi cadena tuviera comillas dobles?

"Hello "World.""

Ahora tengo ambigüedad: el intérprete no sabe dónde termina mi cadena. Si quiero mantener mis comillas dobles, tengo un par de opciones. Podría usar comillas simples alrededor de mi cadena:

'Hello "World."'

O puedo escapar de mis citas:

"Hello \"World.\""

Cualquier cita que esté precedida por una barra oblicua se escapa y se entiende como parte del valor de la cadena.

Cuando se trata de consultas, MySQL tiene ciertas palabras clave que busca que no podemos usar en nuestras consultas sin causar cierta confusión. Supongamos que tenemos una tabla de valores donde una columna se llama "Seleccionar", y queremos seleccionar eso:

SELECT select FROM myTable

Ahora hemos introducido algo de ambigüedad en nuestra consulta. Dentro de nuestra consulta, podemos reducir esa ambigüedad mediante el uso de retrocesos:

SELECT `select` FROM myTable

Esto elimina la confusión que hemos introducido al utilizar un juicio deficiente al seleccionar nombres de campo.

Mucho de esto se puede manejar por usted simplemente transmitiendo sus valores mysql_real_escape_string(). En el siguiente ejemplo, puede ver que estamos pasando datos enviados por el usuario a través de esta función para asegurarnos de que no causará ningún problema para nuestra consulta:

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

Existen otros métodos para cuerdas escapan, como add_slashes, addcslashes, quotemeta, y mucho más, aunque usted encontrará que cuando el objetivo es ejecutar una consulta de seguridad, por lo general prefieren los desarrolladores mysql_real_escape_stringo pg_escape_string(en el contexto de PostgreSQL.

Sampson
fuente
6
Cabe señalar que realizar un escape de cadenas para combatir los problemas de la inyección SQL se considera una mala práctica y puede conducir fácilmente a problemas de seguridad si no se realiza correctamente (especialmente cuando se trata de ciertos tipos de ataques de caracteres multibyte mal formados). Nunca utilice cadenas de escape por este motivo y utilice consultas SQL parametrizadas o procedimientos almacenados.
Cheekysoft
22

Algunos caracteres tienen un significado especial para la base de datos SQL que está utilizando. Cuando estos caracteres se utilizan en una consulta, pueden provocar un comportamiento inesperado y / o no intencionado, incluso permitir que un atacante ponga en peligro su base de datos. Para evitar que estos caracteres afecten a una consulta de esta manera, es necesario escapar, o para decirlo de otra manera, se debe indicar a la base de datos que no los trate como caracteres especiales en esta consulta.

En el caso de mysql_real_escape_string()que se escapa \x00, \n, \r, \, ', "y \x1acomo estos, cuando no se escapó, puede causar los problemas mencionados anteriormente, que incluye inyecciones SQL con una base de datos MySQL.

John Conde
fuente
1

Por simplicidad, básicamente podría imaginarse que la barra invertida "\" sea un comando para el intérprete durante el tiempo de ejecución.

Por ejemplo, al interpretar esta declaración:

$txt = "Hello world!";

durante la fase de análisis léxico (o cuando dividir la declaración en tokens individuales) Estos serían los tokens identificados $, txt, =, ", Hello world!, ", y;

Sin embargo, la barra invertida dentro de la cadena causará un conjunto adicional de tokens y se interpreta como un comando para hacer algo con el carácter que lo sigue inmediatamente: por ejemplo,

$txt = "this \" is escaped";

resultados en las siguientes fichas: $, txt, =, ", this, \, ", is escaped, ", y;

el intérprete ya sabe (o tiene rutas preestablecidas que puede tomar) qué hacer en función del personaje que sucede al \token. Así que en el caso de "que proceda a tratarlo como un carácter y no como el comando de fin de cadena.

supi
fuente