Como funciona a parametrização de consulta SQL?
Eu me sinto um pouco boba por perguntar isso, já que pareço ser a única pessoa no mundo que não entende, mas aqui vai de qualquer jeito. Eu vou usar o Python como um exemplo. Quando eu uso consultas SQL brutas (eu geralmente uso ORMs) eu uso parametrização, como este exemplo usando SQLite:
Método A:
username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)
Eu sei que isso funciona e eu sei que esta é a maneira geralmente recomendada para fazer isso. Uma forma vulnerável de injeção de SQL para fazer a mesma coisa seria algo assim:
Método B:
username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)
Até onde eu sei, eu entendo SQL injection, como explicado emeste artigo da Wikipedia. Minha pergunta é simples: como o método A é realmente diferente do método B? Por que o resultado final do método A não é o mesmo do método B? Eu suponho que ocursor.execute()
O método (parte da especificação DB-API do Python) cuida de escapar corretamente e verificar o tipo de entrada, mas isso nunca é explicitamente declarado em lugar algum. É toda essa parametrização nesse contexto? Para mim, quando dizemos "parametrização", tudo o que isso significa é "substituição de string", como% -formatting. Isso está incorreto?