Segurança de aplicações Java: top 10 vulnerabilidades para iniciantes
Java continua sendo uma das linguagens de programação mais populares para criar aplicações corporativas e web. No entanto, como qualquer outra linguagem, ela está sujeita a ataques. Para desenvolvedores iniciantes, entender os fundamentos de segurança não é apenas uma boa prática, mas uma habilidade essencial. Neste artigo, vamos analisar as 10 vulnerabilidades mais comuns em aplicações Java, fornecer exemplos de código e explicar como proteger seu projeto.
1. SQL Injection
Esta é uma das vulnerabilidades mais antigas e perigosas. Ela ocorre quando a entrada do usuário é inserida diretamente em uma consulta SQL sem tratamento prévio.
Exemplo de código vulnerável:
String query = "SELECT * FROM users WHERE username = '" + userInput + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);Um invasor pode passar para userInput um valor como ' OR '1'='1, o que fará com que todos os dados da tabela sejam retornados.
Como se proteger: Sempre use 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)
Ataques XSS permitem injetar um script malicioso em uma página web, que é então executado no navegador da vítima. Servlets Java e JSP frequentemente são vítimas dessa vulnerabilidade se não escaparem a saída.
Exemplo de código vulnerável:
out.println("<p>Olá, " + request.getParameter("name") + "</p>");Como se proteger: Escape os caracteres HTML ou use mecanismos de template modernos (por exemplo, Thymeleaf ou JSP com JSTL).
// Usando a biblioteca Apache Commons LangString safeInput = StringEscapeUtils.escapeHtml4(userInput);out.println("<p>Olá, " + safeInput + "</p>");3. Cross-Site Request Forgery (CSRF)
CSRF força um usuário a executar uma ação indesejada em um site onde ele está autenticado. Por exemplo, transferir dinheiro ou alterar a senha.
Exemplo de vulnerabilidade:
<img src="https://bank.com/transfer?amount=1000&to=hacker" />Como se proteger: Use tokens CSRF. No Spring Security, isso é feito automaticamente quando a proteção é ativada.
// Ativando a proteção CSRF no Spring Securityhttp.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());4. Desserialização insegura
Java permite restaurar objetos a partir de fluxos de bytes. Se um invasor puder passar um objeto serializado malicioso, isso pode levar à execução de código arbitrário.
Exemplo de código vulnerável:
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());Object obj = ois.readObject(); // Operação potencialmente perigosaComo se proteger:
- Não desserialize dados de fontes não confiáveis.
- Use listas brancas de classes.
- Utilize alternativas como JSON (Jackson/Gson) com validação.
5. Vulnerabilidades em bibliotecas (Dependency Vulnerabilities)
Projetos Java modernos usam dezenas de bibliotecas de terceiros (Maven, Gradle). Versões desatualizadas ou vulneráveis são uma causa comum de invasões.
Como se proteger:
- Atualize as dependências regularmente.
- Use ferramentas de análise: OWASP Dependency-Check, Snyk, GitHub Dependabot.
- Adicione verificação no pipeline CI/CD.
6. Autenticação insegura e gerenciamento de sessões
Fra