flawopen.com/SQL Injection/O que é uma consulta parametrizada?
O que é uma consulta parametrizada, em termos simples?
Pense em um formulário com campos identificados: o programa mantém as instruções fixas e pede à biblioteca de banco de dados que coloque cada valor no campo correspondente. A biblioteca pode usar preparação nativa no servidor ou simulá-la no cliente, mas o código não deve reescrever as instruções com dados fornecidos pelo usuário.
O mecanismo
Com uma instrução preparada nativamente no servidor, o driver prepara o SQL com marcadores e fornece os valores vinculados durante a execução. O protocolo e o momento variam conforme o banco e o driver. Alguns drivers podem simular a preparação no cliente; o PDO documenta esse modo explicitamente. Portanto, só a chamada da API não revela como o valor é transmitido. Mantenha fixa a estrutura SQL, use a API de vinculação documentada pelo driver e verifique se o modo nativo ou simulado está ativo.
Por que isso é diferente de apenas "escapar com cuidado"
O escaping manual exige que o código da aplicação codifique corretamente os valores antes de concatená-los; isso é frágil e depende do contexto. Uma API de parâmetros delega o tratamento dos valores ao driver. Na preparação nativa no servidor, os valores são enviados em parâmetros separados no protocolo; na simulação, o driver processa os marcadores no cliente. Não insira entrada do usuário em strings SQL montadas pela aplicação e verifique o comportamento de vinculação documentado pelo driver.
FAQ
Muito relacionado — um prepared statement é o objeto do lado do banco criado a partir da estrutura fixa da consulta; a parametrização é a prática de vincular valores a ele separadamente. Os termos costumam ser usados como sinônimos.
Só para valores (dados), não para identificadores como nomes de tabelas ou colunas — esses precisam de outra defesa, normalmente uma lista de permissões.
Referências
- OWASP — Cheat Sheet de prevenção de SQL Injection
- flawopen.com — SQL Injection (todas as linguagens)
- PHP Manual — PDO::ATTR_EMULATE_PREPARES
- MySQL Reference — COM_STMT_PREPARE
- MySQL Reference — COM_STMT_EXECUTE