Segurança de aplicações Java: top 10 vulnerabilidades na prática
A segurança de aplicações Java não é apenas uma marcação em uma lista de verificação, mas um aspecto criticamente importante do desenvolvimento. De acordo com a OWASP, mais de 70% das aplicações web modernas contêm pelo menos uma vulnerabilidade crítica. Neste artigo, analisaremos as 10 ameaças mais comuns com exemplos reais de código e formas de corrigi-las. O material será útil tanto para desenvolvedores Java iniciantes quanto para os experientes.
1. SQL Injection (Injeção)
O SQL Injection continua sendo o líder entre as vulnerabilidades. O atacante pode inserir código SQL malicioso através da entrada do usuário.
Código vulnerável:
String query = "SELECT * FROM users WHERE username = '" + username + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);Código corrigido (uso de PreparedStatement):
String query = "SELECT * FROM users WHERE username = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, username);ResultSet rs = pstmt.executeQuery();2. XSS (Cross-Site Scripting)
Ataques XSS permitem a injeção de scripts do lado do cliente em páginas web. A principal defesa é a sanitização da saída.
Código vulnerável (JSP):
<%= request.getParameter("comment") %>Código corrigido:
<%= Encode.forHtml(request.getParameter("comment")) %>Use a biblioteca OWASP Java Encoder para uma sanitização confiável:
import org.owasp.encoder.Encode;String safeOutput = Encode.forHtml(userInput);3. Desserialização insegura
A desserialização em Java pode levar à execução remota de código (RCE).
Código vulnerável:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());Object obj = ois.readObject(); // Perigo!Recomendações de proteção:
- Não desserializar dados de fontes não confiáveis
- Usar uma lista branca de classes durante a desserialização
- Aplicar JSON ou XML em vez da serialização Java
// Abordagem segura com verificação de classeObjectInputStream ois = new ObjectInputStream(inputStream) { @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (!allowedClasses.contains(desc.getName())) { throw new InvalidClassException(desc.getName(), "Unauthorized deserialization"); } return super.resolveClass(desc); }};4. CSRF (Cross-Site Request Forgery)
Ataques CSRF forçam o usuário a executar ações indesejadas em um site onde ele está autenticado.
Proteção com tokens (Spring Security):
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); }}Adicionando o token ao formulário:
<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. Vazamento de informações através de exceções
Mensagens de erro detalhadas podem revelar a estrutura interna da aplicação.
Código vulnerável:
try { // lógica de negócio} catch (SQLException e) { response.getWriter().println("Erro: " + e.getMessage()); // Vazamento!}<