2012-01-03 10 views
6

que estoy haciendo algo de investigación en seguridad web, y el revisor de mi artículo dice:Prevención de la inyección de sql: ¿por qué se debe evitar la entrada si se utilizan las declaraciones preparadas?

"Debe quedar claro que, para evitar la inyección de SQL, la aplicación debe utilizar declaraciones preparadas, procedimientos almacenados y escapar de entrada"

Mi pregunta es: ¿uno de estos métodos no es suficiente? Ok, las declaraciones preparadas o los procedimientos almacenados son mejores que un simple escape, pero si uso PDO, ¿por qué debería escapar de la entrada o tener un procedimiento almacenado? ¿Esto tiene sentido?

+1

Al leer su pregunta me da la impresión de que está interpretando la frase * 'declaraciones preparadas, procedimientos almacenados y entrada de escape' * como * '(declaraciones preparadas o procedimientos almacenados) y entrada de escape' *. :) Para ser sincero (aunque pueda ser tonto), lo interpretaría como * 'declaraciones preparadas o procedimientos almacenados o entrada de escape' *. –

Respuesta

8

que cambiaría la redacción del revisor a:

Debe quedar claro que, para evitar la inyección de SQL, la aplicación debe utilizar declaraciones preparadas, escapar de entrada, o la aplicación de filtro de datos antes de la interpolación en una cadena SQL.

No es necesario escapar un valor si va a pasar como un parámetro. De hecho, no deberías, porque insertarás barras invertidas literales en tus datos.

Necesita interpolar cadenas en su declaración SQL cuando no puede usar un parámetro de consulta. Los ejemplos incluyen: los nombres de

  • de mesa y nombres de columna, que tienen su own syntax for delimited identifiers. Estos deben ser parte de la consulta SQL en el momento de preparación, por lo que el RDBMS puede analizarlos y validarlos.

  • Palabras clave de SQL, que se deben desinfectar pero no se pueden escapar porque no están delimitadas.

  • Otra sintaxis o expresiones.

  • Algunos casos en los que se deben proporcionar valores literales en tiempo de preparación, p. Ej. Las funciones de texto completo de MySQL no admiten parámetros para el patrón de búsqueda.

Los procedimientos almacenados no son una defensa contra la inyección de SQL. Puede preparar y ejecutar sentencias SQL dinámicas no seguras dentro de un procedimiento almacenado. Ver http://thedailywtf.com/Articles/For-the-Ease-of-Maintenance.aspx para una gran historia sobre eso.

cubro todos estos casos en mi presentación SQL Injection Myths and Fallacies. Eso puede ser un recurso útil para usted.

También cubro defensa de inyección SQL en un capítulo de mi libro, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.

+0

gracias. Cosas realmente buenas – Daniel

4

Si uso PDO, ¿por qué debería escabullir la entrada o tener un procedimiento almacenado?

Mientras siempre uso DOP, no veo una razón para molestarse con entrada de escapar o SP.

2

En caso de duda, pregúntese: ¿esta parte de los datos de entrada simple será escapada por algún API más adelante? La mayoría de las veces lo harán, excepto cuando construyas oraciones SQL manualmente a partir de datos de entrada.

No debe escapar si usa PDO. No debe escapar si usa las Declaraciones preparadas de JDBC con los parámetros. Del mismo modo, la mayoría de las otras API también se ocupan de esto. Los procedimientos almacenados ni siquiera están relacionados con los datos escapados y su uso no evitará mágicamente los problemas de seguridad de la inyección SQL si los datos de entrada no se escapan en el SQL que ejecuta el procedimiento.

Siempre SQL-Escape de datos que pone en oraciones SQL. Nunca SQL-Escape de datos fuera de las sentencias de SQL.

Cuestiones relacionadas