Me siento un poco tonto por preguntar esto ya que parezco ser la única persona en el mundo que no lo entiende, pero aquí va de todos modos. Voy a usar Python como ejemplo. Cuando uso consultas SQL primas (que suelen utilizar ORM) utilizo parametrización, como en este ejemplo usando SQLite:¿Cómo funciona la parametrización de consultas SQL?
Método A:
username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)
Sé que esto funciona y sé que esto es el recomendado en general forma de hacerlo Una forma de inyección SQL vulnerables a hacer la misma cosa sería algo como esto:
Método B:
username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)
Por lo que puedo decir que entiendo la inyección de SQL, como se explica en this Wikipedia article. Mi pregunta es simple: ¿cómo es el método A realmente diferente al método B? ¿Por qué el resultado final del método A no es el mismo que el método B? Supongo que el método cursor.execute()
(parte de la especificación DB-API de Python) se encarga de escanear correctamente y verificar el tipo de entrada, pero esto nunca se menciona explícitamente en ninguna parte. ¿Es eso todo lo que la parametrización en este contexto es? Para mí, cuando decimos "parametrización", todo lo que significa es "sustitución de cadena", como% -formateando. Es eso incorrecto?
lo usaría con procedimientos almacenados, pero solo es una buena pregunta. Después de leer un poco, descubrí que se debe a que Calsbeek dijo a continuación. La consulta parametrizada tomaría 'wayne; drop table users' como todo el nombre de usuario para buscar y no lo verá como un conjunto adicional de instrucciones. El último comentario en esta página me mostró que: http://taylorza.blogspot.com/2009/04/sql-injection-are-parameterized-queries.html – johnny