Como usar Prepared Statements com PDO para prevenir SQL Injection (Guia para Iniciantes)
Olá, querido(a) cliente da GeHost! 🌟
Se você já trabalhou com formulários em sites — como login, cadastro ou pesquisa — provavelmente já se perguntou: “E se alguém digitar algo malicioso no campo?” Isso é o que chamamos de SQL Injection, um dos maiores riscos de segurança em sites que usam bancos de dados.
Hoje, vou te mostrar como proteger seu site com um método simples, poderoso e super recomendado: os Prepared Statements usando o PDO (PHP Data Objects).
É como colocar uma cadeia de segurança em cada pergunta que seu site faz ao banco de dados. 🛡️
Por que isso é importante?
Imagine um formulário de login onde alguém digita:
Usuário: admin
Senha: 12345'; DROP TABLE usuarios; --
Se o seu código não for protegido, esse texto malicioso pode destruir sua tabela de usuários — e isso é um pesadelo!
Com prepared statements, isso não acontece. O PHP entende que tudo o que vem do usuário é apenas dado, não código. É como se o sistema dissesse: “Você pode digitar o que quiser, mas eu só aceito como texto, nunca como comando.”
Passo a passo: Como usar Prepared Statements com PDO
Vamos aprender com um exemplo prático: um formulário que busca um usuário pelo nome.
- Crie um banco de dados e uma tabela no cPanel (use a ferramenta Bancos de Dados MySQL).

- Conecte-se ao banco usando PDO. Abra seu arquivo PHP (por exemplo,
login.php) e adicione este código:
<?php
$host = 'localhost';
$dbname = 'seu_banco';
$username = 'seu_usuario';
$password = 'sua_senha';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Erro na conexão: " . $e->getMessage());
}
?>
Use prepared statements para buscar dados. Agora, vamos fazer a busca de forma segura:
<?php
// Supondo que o nome foi enviado por um formulário (POST)
$nome = $_POST['nome'];
// Preparar a consulta com placeholders (?)
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE nome = ?");
// Executar com os dados do usuário
$stmt->execute([$nome]);
// Buscar os resultados
$usuario = $stmt->fetch();
if ($usuario) {
echo "Usuário encontrado: " . $usuario['nome'];
} else {
echo "Usuário não encontrado.";
}
?>
Veja como o ? é um placeholder — ele espera um valor, mas nunca interpreta como código.
// ❌ NÃO FAÇA ISSO!
$nome = $_POST['nome'];
$query = "SELECT * FROM usuarios WHERE nome = '$nome'";
$pdo->query($query);
Esse código é perigoso e abre portas para ataques. Sempre use prepare + execute.
Trate erros com segurança. Sempre usetry/catch para evitar que erros de banco apareçam para o usuário.
Dicas de ouro do Sensei da GeHost
- Use sempre placeholders — seja
?ou:nome(nomes nomeados). - Evite
mysql_query()— ele está obsoleto e inseguro. - Validação de dados ainda é importante! Use
filter_var()oupreg_match()para garantir que o usuário digite o que esperamos. - Use conexão com PDO com modo de erro estrito — como fizemos com
setAttributes.
Conclusão: segurança começa com você
Prepared statements com PDO são como um escudo mágico contra SQL Injection. Você não precisa ser um especialista em segurança para usá-los — basta seguir os passos simples que mostramos.
Com essa prática, seu site fica mais seguro, mais confiável e mais profissional. E o melhor? Você está protegendo seus dados e os de seus usuários. 🙌
Se tiver dúvidas, o suporte da GeHost está aqui para te ajudar. Basta entrar em contato — estamos sempre prontos para te guiar.
Com carinho,
Sensei da GeHost 💙