Segurança de aplicações Java: top 10 vulnerabilidades e como evitá-las

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

Introdução: por que a segurança de aplicações Java é crítica?

Java continua sendo uma das linguagens mais populares para criar 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), a maioria das invasões ocorre devido a erros comuns de desenvolvedores, e não por vulnerabilidades da própria plataforma. Neste artigo, analisaremos as 10 vulnerabilidades mais perigosas em aplicações Java, mostraremos exemplos de código e daremos recomendações práticas de proteção.

1. Injeção de SQL (SQL Injection)

Problema: Passar dados de usuário não validados em uma consulta SQL.

Exemplo de código vulnerável:

String query = "SELECT * FROM users WHERE username = '" + userInput + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

Solução: Use consultas parametrizadas (PreparedStatement).

String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, userInput);
ResultSet rs = pstmt.executeQuery();

2. Cross-Site Scripting (XSS)

Problema: Injeção de scripts maliciosos em uma página web através da entrada do usuário.

Exemplo de vulnerabilidade:

String comment = request.getParameter("comment");
out.println("<div>" + comment + "</div>");

Solução: Escape os caracteres HTML. Use bibliotecas como OWASP Java Encoder.

import org.owasp.encoder.Encode;
String comment = request.getParameter("comment");
out.println("<div>" + Encode.forHtml(comment) + "</div>");

3. Desserialização insegura

Problema: Um invasor pode enviar um objeto serializado que, ao ser desserializado, executará código arbitrário.

Exemplo:

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object obj = ois.readObject(); // Perigoso!

Solução:

  • Não desserialize dados de fontes não confiáveis.
  • Use listas brancas de classes (look-ahead deserialization).
  • Aplique JSON (Jackson) com configurações de segurança.
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // Inseguro!
// Correto: desabilitar defaultTyping e usar @JsonTypeInfo

4. Cross-Site Request Forgery (CSRF)

Problema: Um invasor força o usuário a executar uma ação indesejada em um site confiável.

Solução: Use tokens CSRF. No Spring Security isso é integrado:

<form action="/transfer" method="post">
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
    <input type="text" name="amount"/>
    <button type="submit">Transferir</button>
</form>

5. Falhas de autenticação e gerenciamento de sessão

Problemas: Senhas fracas, cookies não protegidos, sessões fixas.

Recomendações:

  • Use bcrypt ou Argon2 para hash de senhas.
  • Defina os flags HttpOnly e Secure para cookies.
  • Implemente bloqueio após N tentativas de login falhas.
PasswordEncoder encoder = new BCryptPasswordEncoder();
String hashedPassword = encoder.encode(plainPassword);

6. Configuração insegura (Security Misconfiguration)

Problema: Modos debug ativados, senhas padrão, endpoints não protegidos.

Solução:

Blogs

Book Recommendations