2010-04-28 48 views
7

Cuando comencé a escribir las primeras declaraciones SQL en mis programas me sentí bastante cómodo al protegerme contra SQL-Injection con un método muy simple que un colega me mostró. Reemplazó todas las comillas simples con dos comillas simples.Sentencias SQL paramétricas vs. método muy simple

Así que, por ejemplo, hay un campo de búsqueda en el que puede introducir un nombre de cliente para buscar en el menú. Si quieres entrar en

de Peter barbería

la instrucción SELECT se vería

SELECT * 
FROM Customers 
WHERE Customername = 'Peter''s Barbershop' 

Si ahora un atacante podría insertar este:

';DROP TABLE FOO; -- 

La declaración se vería como:

SELECT * 
FROM Customers 
WHERE Customername = ''';DROP TABLE FOO;--' 

No sería soltar cualquier mesa, sino buscar la customertable para la CustomerName '; DROP TABLE FOO; - la cual, supongo, no se encontrará ;-)

Ahora después de un tiempo de la escritura declaraciones y protegiéndome contra SQL-Injection con este método, leí que muchos desarrolladores usan sentencias parametrizadas, pero nunca leí un artículo donde se usó "nuestro" método. Entonces definitivamente hay una buena razón para eso.

¿Qué escenarios cubrirían los enunciados parametrizados pero nuestro método no? ¿Cuáles son las ventajas de las declaraciones parametrizadas en comparación con nuestro método?

Gracias
Philipp

Respuesta

4

Las consultas parametrizadas tienen más proc que la defensa de sql-injection.

  1. Soluciona un problema con la fecha & tiempo formatear & análisis.
  2. Puede preparar el plan de ejecución para la consulta parametrizada.
  3. La protección de inyección sql.

No puedo recordar ahora para otros profesionales :).

Sin embargo, la forma "doblar todas las comillas" tiene problemas con los campos con una longitud de caracteres limitada.

Por ejemplo:

  • La página tiene casilla de "apodo" que puede ser de 10 caracteres de longitud.
  • El usuario inserta "No me importa": los 10 caracteres exactos.

Ahora, si duplica las comillas, el valor tiene 11 caracteres y la base de datos lo "cortará", y obtendrá otro valor en db que el usuario.

Así que recomiendo los parámetros.

+0

El ejemplo "No me importa" no funciona para MS SQL Server 2005 y 2008. Aceptan una cadena más larga si hay comillas dobles en ella. Pero +1 y la respuesta aceptada para los primeros 3 puntos. –

0

¿Cuáles son las ventajas de instrucciones con parámetros comparados con nuestro método?

La ventaja es que es más difícil cometer un error; no puede hacer el método parametrizado y olvida reemplazar las comillas. Además, reemplazar citas es vulnerable si lo haces dos veces.

La desventaja de las consultas parametrizadas (y la razón por la que nunca las uso) es la complejidad. Puede escribir diez veces más consultas ad-hoc antes de obtener RSI.

2

Una gran desventaja es que su solución depende de que un desarrollador recuerde agregar el carácter, obviamente el compilador no se quejará. Eso es peligroso.

En segundo lugar, el rendimiento debe ser mejorado con las instrucciones SQL con parámetros, como señala Jeff cabo here (en !!!).

+0

¡Gracias por el enlace! –

+0

No hay problema. ¿Qué lenguaje de programación estás usando en la capa de aplicación? –

+0

Estoy usando VB.NET. –

1

Una de las ventajas es que el propio controlador determinará qué tiene que escapar y qué no necesita ser escapado.Su método podría ser roto con una entrada como esta:

\'; DROP TABLE foo;-- 

que daría lugar a

SELECT * 
    FROM Customers 
    WHERE Customername = '\'';DROP TABLE FOO;--' 

La primera cita se escapó, el segundo no lo hace y se cierra la cadena.

+0

¿Qué base de datos reconoce \ como un escape para '''? – Andomar

+0

Oh, ahora lo voté rápidamente, intenté este pero no funcionó. La declaración se parece a la que publicaste, pero toda la parte DROP TABLE está recoginada como una cadena.El \ no hizo nada, es solo el primer personaje de la cadena. –

+1

¡Y el escenario de Bobby es, por supuesto, lo segundo que intentaría un atacante! Regla de programación defensiva n. ° 1: Nunca aplique su propia seguridad. – dthrasher

1

Respuesta corta:
Debe usar consultas parametrizadas simplemente porque el servidor de la base de datos sabe mejor que usted de qué caracteres se debe escapar.

Respuesta larga:
' no es necesariamente el único carácter especial que necesita escaparse. Estos caracteres especiales difieren del servidor de base de datos al servidor de base de datos. MySQL, por ejemplo, también usa \ como un carácter de escape (a menos que se haya configurado sql_mode=NO_BACKSLASH_ESCAPES). Por lo tanto, '' y \' significan lo mismo.

Esto no es cierto para, digamos, Oracle.

+0

MySQL (o al menos mi instalación) no reconoce \ como un carácter de escape. – Andomar

+1

@Andomar: el comportamiento de MySQL también depende del modo del servidor. Si 'sql_mode = NO_BACKSLASH_ESCAPES' u otro modo que lo incluye, \ ya no está permitido para escapar caracteres: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html# sqlmode_no_backslash_escapes – Powerlord

+0

+1. Puede haber octetos binarios en la entrada, o la conexión de DB puede tener una noción de compatibilidad de juegos de caracteres que su código de escape no tiene, etc. – pilcrow