Segurança de aplicações PHP: top 10 vulnerabilidades para iniciantes
O PHP continua sendo uma das linguagens mais populares para desenvolvimento web, mas sua flexibilidade frequentemente causa sérios erros de segurança. Para um iniciante, é fácil deixar passar uma vulnerabilidade crítica que pode levar ao vazamento de dados ou à invasão completa do servidor. Neste artigo, vamos abordar as 10 vulnerabilidades mais comuns em aplicações PHP, mostrar exemplos de código perigoso e ensinar como se proteger corretamente. O material foi preparado especialmente para desenvolvedores iniciantes que desejam escrever código seguro desde o primeiro dia.
1. SQL Injection
Esta é a vulnerabilidade mais conhecida e perigosa. Ela ocorre quando a entrada do usuário é inserida diretamente em uma consulta SQL sem escape. Um invasor pode obter acesso ao banco de dados, alterar ou excluir dados.
Código perigoso:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Como se proteger: Use prepared statements com PDO ou MySQLi.
<?php$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");$stmt->execute(['id' => $_GET['id']]);?>2. XSS (Cross-Site Scripting)
O XSS permite que um invasor injete código JavaScript malicioso em uma página que é exibida para outros usuários. Isso pode levar ao roubo de cookies de sessão ou ao redirecionamento para sites de phishing.
Código perigoso:
<?phpecho "Olá, " . $_GET['name'];?>Como se proteger: Sempre escape a saída com htmlspecialchars().
<?phpecho "Olá, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Cross-Site Request Forgery)
O ataque CSRF força um usuário autenticado a executar uma ação indesejada no site (por exemplo, alterar a senha ou transferir dinheiro). O ataque ocorre quando o usuário clica em um link em um site de terceiros.
Como se proteger: Use tokens CSRF para todos os formulários e requisições que alteram o estado.
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}?><form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">Excluir conta</button></form>4. Manipulação insegura de arquivos
Permite que um invasor leia ou escreva arquivos arbitrários no servidor. Por exemplo, através de path traversal ou upload de shells PHP.
Código perigoso:
<?phpinclude($_GET['page'] . '.php');?>Como se proteger: Nunca use entrada do usuário em caminhos de arquivos. Use listas brancas de valores permitidos.
<?php$allowed_pages = ['home', 'about', 'contact'];$page = $_GET['page'] ?? 'home';if (in_array($page, $allowed_pages)) { include($page . '.php');} else { include('404.php');}?>5. Falhas de autenticação e gerenciamento de sessão
Senhas fracas, falta de proteção contra força bruta, fixação de sessão — tudo isso abre caminho para a captura de contas de usuário.
Recomendações:
- Armazene senhas apenas de forma hash usando
password_hash(). - Use HTTPS para todas as páginas de login.
- Regenere o ID da sessão após o login:
session_regenerate_id(true). - Defina um tempo de vida curto para a sessão.
6. Insecure Direct Object Reference (IDOR)
ID