FlawOpen

flawopen.com/SQL Injection/O que é uma consulta parametrizada?

O que é uma consulta parametrizada, em termos simples?

Página de referência
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

Isso é a mesma coisa que um "prepared statement"?

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.

Isso funciona para toda parte de uma consulta?

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

Veja também SQL Injection (CWE-89): como funciona e como evitar em todas as linguagens — flawopen.com Prisma $queryRaw: é seguro contra SQL Injection? Interpolação em where() do Rails é segura? Sequelize query() é seguro contra SQL Injection? SQLAlchemy text() é seguro contra SQL Injection? A verificação de consultas do sqlx em compilação evita SQL injection? Procedimentos armazenados evitam SQL injection?