Segurança de aplicações PHP: top 10 vulnerabilidades na prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 finfo para 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

Blogs

Book Recommendations