Segurança de aplicações PHP: top 10 vulnerabilidades e métodos de proteção
O PHP continua sendo uma das linguagens mais populares para desenvolvimento web, no entanto, sua flexibilidade muitas vezes resulta em vulnerabilidades. De acordo com relatórios de segurança, mais de 70% das aplicações web possuem pelo menos uma vulnerabilidade crítica. Neste artigo, analisaremos as 10 vulnerabilidades PHP mais perigosas, forneceremos exemplos reais de código e mostraremos como proteger efetivamente sua aplicação.
1. SQL Injection
A vulnerabilidade mais comum e perigosa. Um invasor pode injetar código SQL arbitrário através da entrada do usuário.
Código vulnerável:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Proteção: uso de Prepared Statements:
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>2. XSS (Cross-Site Scripting)
Injeção de scripts maliciosos em páginas web. Existem três tipos: refletido, armazenado e DOM-based.
Código vulnerável:
<?phpecho "Olá, " . $_GET['name'];?>Proteção: escape de saída:
<?phpecho "Olá, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Cross-Site Request Forgery)
Ataque no qual o invasor força o usuário a executar ações indesejadas em um site onde ele está autenticado.
Proteção: uso de tokens CSRF:
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}
// Verificação ao enviar o formulárioif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Ataque CSRF detectado!');}?>
<form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">Enviar</button></form>4. Path Traversal
Vulnerabilidade que permite ler arquivos arbitrários no servidor.
Código vulnerável:
<?php$file = $_GET['file'];include("pages/" . $file);?>Proteção: validação e restrição de caminhos:
<?php$allowed_files = ['about.php', 'contact.php', 'home.php'];$file = basename($_GET['file']);
if (in_array($file, $allowed_files)) { include("pages/" . $file);} else { die('Acesso negado');}?>5. File Upload
O upload inseguro de arquivos pode levar à execução de código arbitrário no servidor.
Proteção: verificação do tipo MIME e extensão:
<?php$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];$max_size = 5 * 1024 * 1024; // 5 MB
if ($_FILES['file']['size'] > $max_size) { die('Arquivo muito grande');}
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
if (!in_array($mime_type, $allowed_types)) { die('Tipo de arquivo não permitido');}
// Renomeamos o arquivo por segurança$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);$new_name = md5(uniqid()) . '.' . $extension;move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $new_name);?>6. Session Fixation
Ataque no qual o invasor impõe ao usuário um identificador de sessão conhecido.
Proteção: regeneração do ID da sessão:
<?phpsession_start();
// Após autenticação bem-sucedidai