2012-05-18 9 views
52

Estaba leyendo Does $_SESSION['username'] need to be escaped before getting into an SQL query? y decía "Debe escaparse 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 por sí solo tenía 20 páginas de resultados, pero nadie realmente explica qué es escaparse de una cadena o cómo hacerlo. Simplemente se supone. ¿Me puedes ayudar? Quiero aprender porque, como siempre, estoy haciendo una aplicación web en PHP.¿Qué significa escapar de una cuerda?

he visto: Inserting Escape Characters, What are all the escape characters in Java?, Cant escape a string with addcslashes(), Escape character, what does mysql_real_escape_string() really do?, How can i escape double quotes from a string in php?, MySQL_real_escape_string not adding slashes?, remove escape sequences from string in php Podría seguir, pero estoy seguro de que usted consigue el punto. Esto no es pereza

+4

PS podría tener apenas le pidió a un amigo y No me hice el tonto, pero pensé que habría mucha gente como yo preguntándome de qué está hablando esta cosa. – Brett

Respuesta

95

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

"Hello World." 

Pero lo que si mi cadena tenía comillas dobles dentro de ella?

"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 utilizar comillas simples alrededor de mi cadena:

'Hello "World."' 

O puedo escapar de mis citas:

"Hello \"World.\"" 

Cualquier cita que está precedido por una barra es escaparon, y entiende que es parte de la valor de la cadena.

Cuando se trata de consultas, MySQL tiene ciertas palabras clave que observa que no podemos usar en nuestras consultas sin causar confusión. Supongamos que tenemos una tabla de valores en una columna fue nombrado "Seleccionar", y queríamos para seleccionar lo siguiente:

SELECT select FROM myTable 

ahora hemos introducido cierta ambigüedad en nuestra consulta. Dentro de nuestra consulta, podemos reducir esa ambigüedad mediante el uso de copias de las garrapatas:

SELECT `select` FROM myTable 

Esto elimina la confusión que hemos introducido mediante el uso de la falta de juicio en la selección de nombres de campo.

Mucho de esto puede ser manejado por usted simplemente pasando sus valores a través de mysql_real_escape_string(). En el siguiente ejemplo se puede ver que estamos pasando los datos enviados por los usuarios a través de esta función para asegurarse de que no causará ningún problema para nuestra consulta: existen

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

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

+0

dijiste que se puede manejar mucho de esto simplemente pasando tus valores a través de 'mysql_real_escape_string()' ¿puedes ampliar tu respuesta para decirnos qué es lo que no puede o es una gran pregunta? – Brett

+0

@Brett No es un problema, he agregado un poco más al final de la respuesta. – Sampson

+0

Gracias @Jonathan muy apreciado. – Brett

15

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 o no deseado, incluido permitir que un atacante comprometa su base de datos. Para evitar que estos caracteres afecten a una consulta de esta manera, necesitan ser escapados, o para decirlo de otra manera, debe decirse que la base de datos no los trate como caracteres especiales en esta consulta.

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

+0

@gracias a John esta fue una buena respuesta inicial. Estoy muy contento de que alguien lo haya marcado también porque también fue una respuesta válida. – Brett