str special real_escape_string mysqli_real_escape_string mysql_real_escape_string escape escapar ejemplo comillas characters cadena php security sql-injection

special - php pdo quote



¿Qué hace mysql_real_escape_string() no agrega esolas()? (11)

¿Por qué necesitamos funciones específicas de DB como mysql_real_escape_string ()? ¿Qué puede hacer que addslashes () no lo haga?

Ignorando por el momento la alternativa superior de consultas parametrizadas, es una aplicación web que usa addslashes () exclusivamente aún vulnerable a la inyección SQL, y si es así, ¿cómo?


¿Por qué necesitamos funciones específicas de DB como mysql_real_escape_string ()?

En realidad, la mayoría de las veces no lo hacemos.
Esta función es necesaria para algunas codificaciones extremadamente raras y para embellecer un poco los registros y volcados de mysql.

es una aplicación web que usa addslashes () exclusivamente aún vulnerable a la inyección de SQL?

Siempre que use cualquier juego de caracteres de un solo byte o utf8, es perfectamente seguro con addslashes ().

¿Qué puede hacer que addslashes () no lo haga?

Puede proteger el literal de cadena SQL en el caso de algunas codificaciones raras.

Sin embargo, no puede hacerlo solo. mysql_set_charset() debe establecer una codificación adecuada utilizando la función mysql_set_charset() . Si no se ha utilizado esta función, mysql_real_escape_string() se comportaría exactamente de la misma manera que addslashes() en términos de manejo de conjunto de caracteres: no habría ninguna diferencia .


Agrega barras inclinadas a:

/x00, /n, /r, /, '', " and /x1a. characters.

Donde addslashes solo agrega barras inclinadas a

'' / and NUL

El artículo de Ilias también es bastante detallado sobre su funcionalidad


De acuerdo con el manual de PHP :

mysql_real_escape_string () llama a la función de biblioteca de MySQL mysql_real_escape_string, que antepone barras diagonales inversas a los siguientes caracteres: / x00, / n, / r, /, '', "y / x1a.


La única diferencia real que conozco es que mysql_real_escape_string () tendrá en cuenta el conjunto de caracteres de la base de datos al escapar de la cadena de entrada. Ninguna función escapará de los caracteres comodín% y _, lo que aún deja la secuencia de comandos abierta a alguna inyección SQL.


La función mysql_real_escape_string de PHP, más o menos, le preguntará a mysql qué carácter (s) necesita ser escapado , donde la función addslashses agregará una barra invertida delante de y cualquier comilla simple (''), comillas dobles ("), barra diagonal inversa () o NUL (el byte NULL) personaje.

Los dos efectos prácticos son que las agregaciones tienden a no funcionar bien con los caracteres multibyte y, lo que es más importante, al preguntarle a mysql qué personajes necesitan escaparse, se evita una posible compatibilidad futura. El uso de pestañas es como codificar un par de caracteres específicos en la secuencia de escape.


La respuesta negativa de gs es en verdad un poco correcta.

SQL estándar utiliza el doble para escapar de un apóstrofo literal. El uso no estándar de MySQL de barras diagonales para escaparse es la configuración predeterminada, pero se puede deshabilitar y a menudo lo es, en particular en sql_mode ANSI.

En este caso, solo la sintaxis duplicada funcionará, y cualquier aplicación que tenga usando addslashes (u otro método de escape ad-hoc) se romperá. mysql_real_escape_string usará el método de escape que sea mejor para el sql_mode de la conexión.

El problema de la codificación multibyte también es importante si todavía estás usando esas desagradables codificaciones del este de Asia que reutilizan los 128 caracteres inferiores, pero en realidad quieres usar UTF-8 en su lugar. / n-escaparse, por otro lado, no tiene importancia ya que MySQL perfectamente puede hacer frente a una nueva línea en una declaración.


Las barras añadidas generalmente no son lo suficientemente buenas cuando se trata de cadenas codificadas en varios bytes.


Se supone que debe escapar cadenas para MySQL de una manera que otras instalaciones de citas no lo hacen.

Mucho preferible, sin embargo, es usar la interfaz mysqli , y usar consultas preparadas parametrizadas en lugar de tratar de asegurarse de que todas las cadenas se escapen correctamente. El uso de consultas parametrizadas evita la necesidad de un trabajo de cadena tan complicado y mitiga en gran medida el riesgo de inyección de SQL.

Editar: aclararé un poco sobre por qué considero citar una mala idea: es fácil olvidar cuándo y dónde tiene que citar, si su variable debe ser una cadena o un número, si ya se ha citado, etc. consulta parametrizada no tiene ninguno de estos problemas , y la necesidad de cotización se obvia por completo .


Según mi comprensión, mysql_real_escape_string () hace el trabajo de manera más precisa, ya que se comunica con db para verificar primero qué necesita ser codificado y luego codificar en consecuencia, ¿no es así? Así que hay que trabajar de manera más eficiente

por qué quieres hacer primero addslashes y luego eliminarás esas barras antes de mostrar esos datos y aún agregarlas no es tan eficiente como mysql_real_escape_string, usa mysql_real_escape_string si estás usando mysql_query como funciones db para query, o creo que PDO con prepare es mejor manera , ya que mysql_real_escape_string es específico de db


mysql_real_escape_string hace mucho más que addslashes .

addslashes opera en ascii puro, sin saber nada sobre la base de datos. Se escapa:

  • ''/'
  • "/"
  • ///
  • ASCII 0/0 .

El propósito de mysql_real_escape_string es "crear una cadena SQL legal que pueda usar en una declaración SQL". mysql_real_escape_string tiene en cuenta el conjunto de caracteres actual de la conexión (por lo que siempre debe pasar un objeto $ mysql válido).

Hace lo siguiente (tomado de la documentación de la API C de MySQL):

  • Codifica: / , '' , " , ASCII 0 , /n , /r , y Control+Z de una manera que no causará problemas
  • asegura que un byte 0 termine la cadena (en la api C)
  • puede realizar un multibyte (ascii) para la conversión de caracteres anchos si el DB vinculado a in $ mysql usa un conjunto de caracteres amplio.

Realmente no sé cómo PHP almacena cadenas internamente, pero el punto es que todo esto está disponible para PHP cuando usas mysql_real_escape_string . Supongo que el principal punto de diferencia es mysql_real_escape_string considera el conjunto de caracteres de la conexión , donde addslashes no puede (ni siquiera sabe a qué DB está conectado).


somedb_real_escape_string() es una base de datos específica, addslashes() no lo es.

En el caso de MySQL esto significa:

mysql_real_escape_string () llama a la función de biblioteca de MySQL mysql_real_escape_string, que antepone barras diagonales inversas a los siguientes caracteres: / x00, / n, / r, /, '', "y / x1a.

(Del manual)