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
HttpOnlyeSecurepara 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: