Segurança de aplicações PHP: top 10 vulnerabilidades na prática
O PHP continua sendo uma das linguagens mais populares para desenvolvimento web, mas sua flexibilidade frequentemente resulta em sérios problemas de segurança. De acordo com a OWASP, 80% dos ataques a aplicações web estão relacionados a vulnerabilidades que podem ser prevenidas na fase de escrita do código. Neste artigo, abordaremos as 10 vulnerabilidades mais comuns em aplicações PHP com exemplos reais de código e métodos de proteção. O material será útil tanto para desenvolvedores iniciantes quanto para experientes.
1. Injeção SQL (SQL Injection)
A vulnerabilidade mais perigosa e comum. O atacante insere código SQL através de campos de entrada, obtendo acesso ao banco de dados.
Código vulnerável:
$username = $_POST['username'];$query = "SELECT * FROM users WHERE username = '$username'";Ataque: Inserir ' OR '1'='1 transforma a consulta em SELECT * FROM users WHERE username = '' OR '1'='1', retornando todos os usuários.
Proteção: Use consultas preparadas (prepared statements) com PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");$stmt->execute(['username' => $_POST['username']]);2. XSS (Cross-Site Scripting)
O atacante insere código JavaScript que é executado no navegador da vítima. Existem três tipos: refletido, armazenado e baseado em DOM.
Código vulnerável (XSS armazenado):
echo "<div>" . $comment . "</div>";Proteção: Escape a saída usando htmlspecialchars():
echo "<div>" . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . "</div>";Para conteúdo HTML, use bibliotecas como HTML Purifier.
3. CSRF (Cross-Site Request Forgery)
O ataque força um usuário autenticado a executar uma ação indesejada no site, como alterar a senha ou transferir fundos.
Proteção: Implemente tokens CSRF:
// Geração do token$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// No formulárioecho '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
// Verificaçãoif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Ataque CSRF detectado');}4. Path Traversal (Navegação de diretórios)
O atacante manipula caminhos de arquivos para acessar arquivos do sistema (/etc/passwd, etc.).
Código vulnerável:
$file = $_GET['file'];include("pages/" . $file);Proteção: Use listas brancas ou a função basename():
$allowed = ['home', 'about', 'contact'];$file = basename($_GET['file']);if (in_array($file, $allowed)) { include("pages/$file.php");} else { die('Arquivo inválido');}5. Vulnerabilidades de upload de arquivos (File Upload Vulnerabilities)
O atacante envia um script PHP em vez de uma imagem, obtendo acesso remoto ao servidor.
Proteção:
- Verifique o tipo MIME do arquivo:
$_FILES['file']['type'] - Use
finfopara determinar o tipo real - Impeça a execução de scripts na pasta de uploads via
.htaccess - Gere nomes de arquivo únicos:
md5(uniqid()) . '.jpg'
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);$allowed = ['image/jpeg', 'image/png'];if (!in_array($mime, $allowed)) { die('Tipo de arquivo inválido');}6. Fixação de sessão (Session Fixation)
O atacante impõe ao usuário um identificador de sessão conhecido para interceptá-la após a autenticação.
Proteção: Após o sucesso