Sanitização de dados inseridos pelo usuário
Remova caracteres perigosos com htmlspecialchars e filter_input.
Sanitização de dados inseridos pelo usuário é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
Sanitização versus validação
Validação verifica se os dados atendem aos requisitos (e os rejeita caso não atendam).
Sanitização limpa os dados removendo ou codificando caracteres perigosos para que possam ser usados com segurança.
Ambas são necessárias — valide primeiro e depois faça a sanitização da saída.
htmlspecialchars() para saída HTML
Sempre escape a saída antes de inseri-la no HTML para evitar XSS:
<?php
$name = '<script>alert(1)</script>';
// Dangerous — executes script:
// echo $name;
// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert(1)</script>htmlentities() versus htmlspecialchars()
Ambas fazem o escape de HTML, mas htmlentities converte TODOS os caracteres aplicáveis; htmlspecialchars converte apenas os cinco mais perigosos:
<?php
$str = '<b>café</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8filter_var FILTER_SANITIZE_*
Os modos de sanitização de filter_var removem conteúdo perigoso:
<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com
$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;strip_tags()
Remova as tags HTML de uma string, mantendo opcionalmente as tags permitidas:
<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';
// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)
// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>Sanitização para SQL
Nunca faça a sanitização de SQL com funções de strings — sempre use instruções preparadas. A abordagem correta:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";
// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();addslashes() versus instruções preparadas
addslashes() faz o escape de barras invertidas e aspas — mas NÃO é seguro para SQL. Em vez disso, use instruções preparadas do PDO. addslashes() ainda pode ser útil para finalidades que não envolvam SQL, como a geração de strings de JavaScript:
<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";Sanitização de nomes de arquivos
Remova caracteres perigosos dos nomes de arquivos enviados:
<?php
function sanitizeFilename(string $name): string {
// Remove path traversal chars and other dangerous ones
$name = basename($name); // strip any path
$name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
$name = preg_replace('/_{2,}/', '_', $name); // collapse underscores
return strtolower($name);
}
echo sanitizeFilename('../../../etc/passwd'); // etc_passwd
echo sanitizeFilename('My Photo (1).JPG'); // my_photo_1_.jpgConversão para inteiro de IDs
A forma mais simples de sanitizar IDs numéricos é convertê-los para int, descartando qualquer conteúdo não numérico:
<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";
// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');
// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');O contexto da saída é importante
Diferentes contextos de saída exigem diferentes formas de escape:
- corpo HTML →
htmlspecialchars() - atributo HTML →
htmlspecialchars(ENT_QUOTES) - JSON/JavaScript →
json_encode() - parâmetro de URL →
urlencode() - SQL → instruções preparadas
urlencode e rawurlencode
Codifique valores para usá-los em URLs:
<?php
$search = 'hello world & PHP';
echo urlencode($search);
// hello+world+%26+PHP (+ for spaces)
echo rawurlencode($search);
// hello%20world%20%26%20PHP (RFC 3986 — use in paths)
$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;Verificação rápida
Qual é a forma correta de evitar a injeção de SQL ao usar uma entrada do usuário em uma consulta ao banco de dados?
Recapitulação: sanitização da entrada
Regras de sanitização:
- saída HTML →
htmlspecialchars(ENT_QUOTES, 'UTF-8') - SQL → instruções preparadas, nunca faça escape com strings
- URLs →
urlencode()ourawurlencode() - nomes de arquivos → remova com uma expressão regular e use
basename() - IDs inteiros → converta usando
(int) - tags → use
strip_tags()para filtrar tags permitidas
Perguntas Frequentes
A aula “Sanitização de dados inseridos pelo usuário” é grátis?
Sim — o texto completo de “Sanitização de dados inseridos pelo usuário” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Sanitização de dados inseridos pelo usuário”?
Remova caracteres perigosos com htmlspecialchars e filter_input. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Sanitização de dados inseridos pelo usuário”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- GET versus POST: quando usar cada um
- Leitura de dados de formulários com superglobais
- Técnicas de validação de entrada
- Sanitização de dados inseridos pelo usuário