Prepared statements no PHP: a defesa contra SQL Injection

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

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 →
Fale conosco