php - significa - soñar con persecuciones
¿Qué significa escapar de una cuerda? (2)
Estaba leyendo ¿Se debe escapar $ _SESSION [''username''] antes de entrar en una consulta SQL? y decía "Necesitas escapar cada cadena que pasas 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.
He visto: Insertar personajes de escape , ¿Cuáles son todos los caracteres de escape en Java? , No se puede escapar de una cadena con addcslashes () , Escape character , ¿qué hace mysql_real_escape_string () realmente? , ¿Cómo puedo escapar las comillas dobles de una cadena en php? , MySQL_real_escape_string no agrega barras diagonales? , 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
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()
escapa a /x00
, /n
, /r
, /
, ''
, "
y /x1a
ya que estos, cuando no se escapan, pueden causar los problemas mencionados anteriormente que incluyen inyecciones de SQL con una base de datos MySQL.
Escapar una cadena significa reducir la ambigüedad entre comillas (y otros caracteres) utilizados en esa cadena. Por ejemplo, cuando define una cadena, generalmente la rodea en comillas dobles o simples:
"Hello World."
¿Pero qué pasa si mi cadena tiene 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 usar comillas simples alrededor de mi cadena:
''Hello "World."''
O puedo escapar de mis citas:
"Hello /"World./""
Cualquier cita precedida de una barra oblicua se escapa y se entiende que forma parte del valor de la cadena.
Cuando se trata de consultas, MySQL tiene ciertas palabras clave que observa y que no podemos usar en nuestras consultas sin causar confusión. Supongamos que tenemos una tabla de valores donde una columna se llama "Seleccionar" y queremos seleccionarla:
SELECT select FROM myTable
Ahora hemos introducido cierta ambigüedad en nuestra consulta. Dentro de nuestra consulta, podemos reducir esa ambigüedad usando back-ticks:
SELECT `select` FROM myTable
Esto elimina la confusión que hemos introducido al usar un juicio deficiente al seleccionar los nombres de los campos.
Mucho de esto puede ser manejado por usted simplemente pasando sus valores a través de 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 garantizar 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 add_slashes
cadenas, como add_slashes
, add_slashes
, quotemeta
y más, aunque encontrará que cuando el objetivo es ejecutar una consulta segura, los desarrolladores en general prefieren mysql_real_escape_string
o pg_escape_string
(en el contexto de PostgreSQL.