2009-07-06 14 views
13

estoy usando la función de MySQL API¿Qué caracteres deben evitarse para evitar (My) inyecciones de SQL?

mysql_real_escape_string() 

Sobre la base de la documentación, que se escapa de los siguientes caracteres:

\0 
\n 
\r 
\ 
' 
" 
\Z 

Ahora, busqué en la biblioteca de seguridad ESAPI de OWASP.org y en el puerto de Python que tenía el siguiente código (http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql.py):

 """ 
     Encodes a character for MySQL. 
     """ 
     lookup = { 
     0x00 : "\\0", 
     0x08 : "\\b", 
     0x09 : "\\t", 
     0x0a : "\\n", 
     0x0d : "\\r", 
     0x1a : "\\Z", 
     0x22 : '\\"', 
     0x25 : "\\%", 
     0x27 : "\\'", 
     0x5c : "\\\\", 
     0x5f : "\\_", 
     } 

Ahora, me pregunto si todos los personajes son realmente necesarios para ser eS vestido de capa. Entiendo por qué% y _ están ahí, son metacaracteres en el operador LIKE, pero no puedo entender simplemente por qué agregaron caracteres de retroceso y tabulador (\ b \ t)? ¿Existe un problema de seguridad si realiza una consulta:

SELECT a FROM b WHERE c = '...user input ...'; 

¿Dónde la entrada del usuario contiene tabuladores o caracteres de retroceso?

Mi pregunta es aquí: ¿Por qué incluyeron \ b \ t en la biblioteca de seguridad de ESAPI? ¿Hay situaciones en las que es posible que deba escapar de esos caracteres?

+0

No soy una persona de pitón o una persona MySql, pero mi primera aunque era buscar pruebas unitarias para esto, por desgracia, no lo hicieron revelar algo útil- http://code.google.com/p/owasp-esapi-python/source/browse/esapi/test/codecs/test_mysql.py – RichardOD

Respuesta

14

El MySQL manual page for strings dice:

  • \0 un carácter ASCII NUL (0x00).
  • \' Un carácter de comilla simple ("'").
  • \" Carácter de comillas dobles (""").
  • \b Un carácter de retroceso.
  • \n Un carácter de nueva línea (avance de línea).
  • \r Carácter de retorno de carro.
  • \t Un carácter de tabulación.
  • \Z ASCII 26 (Control-Z). Vea la nota que sigue a la tabla.
  • \\ Carácter de barra diagonal inversa ("\").
  • \% Un carácter "%". Vea la nota que sigue a la tabla.
  • \_ Un carácter "_". Vea la nota que sigue a la tabla.
+0

Vínculo muerto. Considera actualizar –

+0

FYI, el enlace está funcionando. –

38

Una conjetura sobre el carácter de retroceso: Imagínese que usted envía un email "Hola, aquí está la consulta para actualizar su base de datos, ya que queríamos" y un archivo de texto adjunto con

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6); 

Usted cat el archivo, ver que es está bien, y solo canaliza el archivo a MySQL. Lo que no sabía, sin embargo, fue que puse

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b 

antes de la instrucción de inserción, que usted no vio ya en la salida de la consola las teclas de retroceso sobrescribieron ella. Bamm!

Solo una conjetura, sin embargo.

Editar (no podía resistir):

alt text

+12

+1 para la referencia a mi comic favorito de XKCD –

+1

No fue t like this in the original http://xkcd.com/327/ –

+3

Gracias Stefano, que cumple con la cláusula de atribución de la licencia CC. – balpha

4

listas negras (identificación de personajes malos) no es el camino a seguir, si usted tiene cualquier otra opción.

Necesita combinar una lista blanca y, lo que es más importante, enfoques de parámetros limitados.

Si bien esta respuesta en particular tiene un enfoque de PHP, todavía ayuda mucho y ayudará a explicar que simplemente ejecutar una cadena a través de un filtro de char no funciona en muchos casos. Por favor, consulte Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

0

¿Dónde la entrada del usuario contiene tabuladores o caracteres de retroceso?

Es bastante notable un hecho que hasta el día de hoy la mayoría de los usuarios creen que es entrada del usuario tienen que ser escapado, y tal escapar "evita las inyecciones".

-2

¿no podría uno borrar la (s) cita (s) única (es) de la entrada del usuario?

por ejemplo: $input =~ s/\'|\"//g;

+0

no sé si eso es una buena idea –

+0

Si está tratando de almacenar un nombre, como O'Leary, arruinaría el nombre de la persona. Si está almacenando una oración como '' ¡Ayuda! '', David gritó. '' Querrá mantener las comillas dobles. Así que sí, en algunos casos, el dumping de caracteres especiales podría estar bien, pero no en todos. – Bing

0

Java solución:

public static String filter(String s) { 
    StringBuffer buffer = new StringBuffer(); 
    int i; 

    for(byte b : s.getBytes()) { 
     i = (int) b; 

     switch(i) { 
      case 9 : buffer.append(" "); break; 
      case 10 : buffer.append("\\n" ); break; 
      case 13 : buffer.append("\\r" ); break; 
      case 34 : buffer.append("\\\""); break; 
      case 39 : buffer.append("\\'" ); break; 
      case 92 : buffer.append("\\" ); 

      if(i > 31 && i < 127) buffer.append(new String(new byte[] { b })); 
     } 
    } 

    return buffer.toString(); 
} 
+0

La pregunta real ** no se trata de "Java" ** (ver etiquetas) ... – Axel

Cuestiones relacionadas