Introdução: Por que a segurança de aplicações Java não é uma opção, mas uma necessidade
Java continua sendo uma das linguagens mais populares para o desenvolvimento de aplicações corporativas e web. No entanto, a popularidade também atrai maior atenção de agentes maliciosos. De acordo com o OWASP (Open Web Application Security Project), vulnerabilidades no código levam anualmente a vazamentos de dados e perdas financeiras na casa dos bilhões de dólares. Neste artigo, abordaremos as 10 principais vulnerabilidades de aplicações Java, mostraremos exemplos reais de código e daremos recomendações específicas de proteção. O material será útil tanto para desenvolvedores iniciantes quanto para experientes que buscam escrever código seguro.
1. Injeções: SQL, LDAP e Command Injection
As injeções continuam sendo o rei das vulnerabilidades. O caso mais comum é a injeção de SQL, quando a entrada do usuário é concatenada diretamente em uma consulta SQL.
Exemplo de código vulnerável
String query = "SELECT * FROM users WHERE username = '" + request.getParameter("user") + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);Se um invasor enviar admin' OR '1'='1, ele obterá acesso a todos os usuários.
Como se proteger
- Use PreparedStatement: consultas parametrizadas escapam automaticamente a entrada.
- Valide os dados de entrada no lado do servidor (listas brancas).
- Para LDAP e comandos do SO, use escape e evite chamar
Runtime.exec()com dados do usuário.
// Versão seguraString query = "SELECT * FROM users WHERE username = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, request.getParameter("user"));ResultSet rs = pstmt.executeQuery();2. Falha na autenticação e gerenciamento de sessões
A autenticação fraca é a segunda vulnerabilidade mais perigosa. São comuns: ausência de limite no número de tentativas de login, armazenamento de senhas em texto claro, IDs de sessão previsíveis.
Recomendações
- Armazene senhas apenas como hashes com salt (ex.: bcrypt ou Argon2).
- Use
SecureRandompara gerar tokens de sessão. - Defina timeouts de sessão e um mecanismo "lembrar-me" com token seguro.
// Geração de session ID seguroimport java.security.SecureRandom;String sessionId = new SecureRandom().ints(48, 122) .filter(i -> Character.isLetterOrDigit(i)) .limit(64) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString();3. XSS (Cross-Site Scripting)
XSS permite injetar JavaScript malicioso em uma página visualizada por outros usuários. Isso é especialmente perigoso para aplicações web em Java com JSP ou Thymeleaf.
Exemplo de vulnerabilidade
<div>${userComment}</div>Se userComment contiver <script>alert('XSS')</script>, o código será executado no navegador.
Proteção
- Escape a saída: em JSP use
c:outoufn:escapeXml(). - Para Thymeleaf —
th:utexté perigoso, useth:text. - Aplique cabeçalhos de Content Security Policy (CSP).
4. Desserialização insegura
A desserialização em Java é uma das vulnerabilidades mais críticas, permitindo a execução de código arbitrário (RCE). Um invasor pode adulterar o fluxo de bytes e injetar um objeto malicioso.
Exemplo de ataque
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());Object obj = ois.readObject(); // Perigo!Como se proteger
- Não desserialize