Um projeto de demonstração que mostra como construir um formulário robusto, validado e seguro, utilizando:
- Front-end: HTML5 + Bootstrap 5
- Validação Client-side: JavaScript puro, com máscaras de campos (CPF, CEP, salário)
- Back-end: PHP 8.x (sem framework) com:
filter_inputefilter_varpara sanitização- Validação campo a campo (nome, CPF, e-mail, data, salário, CEP, etc.)
- Normalização de strings e acentos (UTF-8 NFC)
- Proteção contra SQL Injection com PDO preparado
- Proteção contra XSS com escape na saída + CSP
- CSRF com double-submit cookie
- Anti-bot Honeypot
├── formulario.html # Formulário com Bootstrap 5, máscaras e validação JS
├── formulario.php # Processamento, validação e integração preparada com PDO
└── vendor/ # Dependências instaladas via Composer
- nome: texto (com acentos)
- cpf: máscara e validação de dígitos verificadores
- email: validação RFC + sanitização
- salario: máscara
R$ 0,00→ normalização para decimal - data_nascimento: exige idade mínima de 14 anos
- genero: rádio (masculino/feminino)
- beneficios: múltipla escolha (
cesta basica,convenio,VT,VR) - endereço: CEP, rua, estado (UF), cidade
-
SQL Injection:
Uso exclusivo de Prepared Statements via PDO. Exemplo:$stmt = $pdo->prepare('INSERT INTO candidatos (nome, cpf, email, ...) VALUES (:nome, :cpf, :email, ...)'); $stmt->execute([':nome'=>$payload['nome'], ':cpf'=>$payload['cpf'], ...]);
-
XSS (Cross-Site Scripting):
-
Entrada sanitizada (filter_var, html_entity_decode, Normalizer).
-
Escape rigoroso na saída com htmlspecialchars.
-
Cabeçalho CSP configurado para bloquear scripts injetados.
-
CSRF (Cross-Site Request Forgery):
-
Double-Submit Cookie: Token gerado no front e comparado com cookie no PHP.
- Campo oculto (honeypot) — se preenchido, request é rejeitado.
- Nenhum dado confiado só pelo JavaScript.
- Regex e funções customizadas para CPF, datas, UF, etc.
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- Strict-Transport-Security
- Permissions-Policy bloqueando câmera/microfone
- CSP com script-src 'self' https://cdn.jsdelivr.net
- Instalação via Composer:
composer require guzzlehttp/guzzle- Sanitização de Acentos
- Consulta CEP Backend: Guzzle com 3 tentativas e timeout.
- Normaliza rua, cidade, UF de acordo com resposta oficial.