Segurança de aplicações PHP: top 10 vulnerabilidades para iniciantes
\nO PHP continua sendo uma das linguagens mais populares para desenvolvimento web, mas sua flexibilidade frequentemente resulta em vulnerabilidades se as regras básicas de segurança não forem seguidas. De acordo com a OWASP, a maioria das invasões ocorre devido a 10 erros típicos cometidos por desenvolvedores iniciantes. Neste artigo, analisaremos cada vulnerabilidade com exemplos reais de código e mostraremos como proteger sua aplicação.
\n\n1. SQL Injection
\nO ataque mais comum. O invasor insere código SQL malicioso através da entrada do usuário.
\nCódigo vulnerável:
\n<?php\n$id = $_GET['id'];\n$query = "SELECT * FROM users WHERE id = $id";\n$result = mysqli_query($conn, $query);\n?>\nProteção: Use prepared statements:
\n<?php\n$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");\n$stmt->bind_param("i", $_GET['id']);\n$stmt->execute();\n$result = $stmt->get_result();\n?>\n\n2. XSS (Cross-Site Scripting)
\nInserção de código JavaScript na página através de dados não validados.
\nCódigo vulnerável:
\n<?php\necho "Olá, " . $_GET['name'];\n?>\nProteção: Escape a saída com htmlspecialchars():
<?php\necho "Olá, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n?>\n\n3. CSRF (Cross-Site Request Forgery)
\nAtaque onde o usuário executa ações indesejadas em seu próprio nome.
\nCódigo vulnerável:
\n<form action="/delete.php" method="POST">\n <input type="submit" value="Excluir conta">\n</form>\nProteção: Adicione um token CSRF:
\n<?php\nsession_start();\n$_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n?>\n<form action="/delete.php" method="POST">\n <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">\n <input type="submit" value="Excluir conta">\n</form>\n\n4. Armazenamento inseguro de senhas
\nArmazenar senhas em texto puro ou com hashes obsoletos (MD5, SHA1).
\nCódigo vulnerável:
\n<?php\n$password = md5($_POST['password']);\n// ou\n$password = sha1($_POST['password']);\n?>\nProteção: Use password_hash() e password_verify():
<?php\n$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);\n// Verificação:\nif (password_verify($input_password, $hash)) {\n echo "Senha correta";\n}\n?>\n\n5. Manipulação insegura de arquivos (Local/Remote File Inclusion)
\nInclusão de arquivos através da entrada do usuário sem validação.
\nCódigo vulnerável:
\n<?php\ninclude($_GET['page'] . '.php');\n?>\nProteção: Use uma lista branca de arquivos permitidos:
\n<?php\n$allowed_pages = ['home', 'about', 'contact'];\n$page = $_GET['page'] ?? 'home';\nif (in_array($page, $allowed_pages)) {\n include($page . '.php');\n} else {\n include('404.php');\n}\n?>\n\n6. Configuração incorreta de sessões
\nUso de identificadores de sessão previsíveis ou ausência de regeneração.
\nCódigo vulnerável:
\n<?php\nsession_start();\n$_SESSION['user_id'] = $user_id;\n// A sessão não é regenerada após o login\n?>\nProteção:
\n<?php\nsession_start();\nsession_regenerate_id(true); // Regeneração do ID após o login\n$_SESSION['user_id'] = $user_id;\n?>\n\n7. Validação insuficiente de entrada
\nConfiar em quaisquer dados do usuário.
\nCó