Prepared statements no PHP: a defesa contra SQL Injection
Prepared statements são a defesa nº 1 contra SQL Injection. Eles enviam o comando SQL e os dados em canais separados, então o banco nunca confunde o valor digitado pelo usuário com instruções a executar. Resultado: a injeção simplesmente não acontece.
Por que concatenar é perigoso
Veja uma consulta vulnerável: o valor do usuário entra direto na string SQL.
// NUNCA faça isso:
$sql = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'";
Se alguém enviar ' OR '1'='1, a condição vira sempre verdadeira e o atacante lê a tabela inteira. Pior: pode apagar dados ou burlar o login.
A forma correta com PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$_POST['email']]);
$user = $stmt->fetch();
Use placeholders posicionais (?) ou nomeados (:email). O dado nunca é interpretado como SQL.
Desative a emulação
Configure o PDO com ATTR_EMULATE_PREPARES => false para usar prepared statements reais no servidor, não uma simulação no cliente. Combine com validação de entrada — veja como escapar a saída para evitar XSS como camada extra.
Perguntas frequentes
Prepared statements deixam o site mais lento?
O impacto é desprezível e some quando a mesma consulta é reutilizada. A segurança compensa de longe.
Preciso escapar o valor antes de usar prepared statement?
Não. O placeholder já trata o valor com segurança. Escape é para a saída (HTML), não para a query.
Continue lendo
- Como prevenir XSS em PHP: escape de saída na prática
- Proteção CSRF em formulários PHP com tokens
- Content-Security-Policy na prática para sites PHP
Procurando uma empresa especializada em segurança WordPress?
O Site Seguro é especialista 100% em segurança WordPress, com SLA, garantia contra reincidência e atendimento humano no Brasil.
Conhecer nosso serviço →