Como prevenir SQL Injection em Java?

A prevenção contra SQL Injection em Java é essencial para garantir a segurança de aplicações que interagem com bancos de dados.

Como prevenir SQL Injection em Java?

O SQL Injection é uma técnica de ataque onde um invasor insere comandos SQL maliciosos em entradas de usuário para manipular o banco de dados indevidamente. Aplicações Java que utilizam JDBC precisam implementar boas práticas para evitar esse risco.

1. O Que é SQL Injection?

O SQL Injection ocorre quando entradas do usuário não são validadas corretamente e são diretamente concatenadas em uma consulta SQL. Por exemplo:

Statement stmt = conexao.createStatement();
String usuario = "' OR '1'='1"; // Entrada maliciosa
String sql = "SELECT * FROM usuarios WHERE nome = '" + usuario + "'";
ResultSet rs = stmt.executeQuery(sql);

Problema: O código acima permite que um invasor manipule a consulta e acesse todos os registros do banco.

2. Usando PreparedStatement para Evitar SQL Injection

A melhor maneira de evitar SQL Injection é usar PreparedStatement, que trata os valores de entrada como parâmetros seguros.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SegurancaSQL {
    public static void main(String[] args) {
        String sql = "SELECT * FROM usuarios WHERE nome = ?";

        try (Connection conexao = ConexaoJDBC.conectar();
             PreparedStatement stmt = conexao.prepareStatement(sql)) {

            stmt.setString(1, "João"); // Definindo parâmetro seguro
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                System.out.println("Nome: " + rs.getString("nome"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Explicação: O uso de ? nos valores evita a manipulação direta da consulta, tornando-a segura.

3. Validação e Sanitização de Entrada de Dados

Além de PreparedStatement, é importante validar e sanitizar as entradas do usuário.

  • Remover caracteres especiais não permitidos na entrada.
  • Validar o formato dos dados antes de enviá-los ao banco.
  • Usar whitelists para aceitar apenas valores esperados.
public static boolean validarEntrada(String input) {
    return input.matches("^[a-zA-Z0-9]+$"); // Apenas letras e números
}

4. Uso de ORM (Hibernate) para Abstração de Banco

Frameworks ORM como Hibernate gerenciam consultas automaticamente e reduzem a exposição ao SQL Injection.

List<Usuario> usuarios = entityManager.createQuery("SELECT u FROM Usuario u WHERE u.nome = :nome")
                                     .setParameter("nome", "João")
                                     .getResultList();

5. Boas Práticas para Prevenir SQL Injection

  • Sempre use PreparedStatement em vez de Statement.
  • Evite construir SQL dinamicamente com concatenação de strings.
  • Valide todas as entradas do usuário antes de usá-las.
  • Utilize ORM como Hibernate para reduzir exposição a consultas SQL.
  • Monitore logs do banco para detectar tentativas de injeção.

Conclusão

SQL Injection é uma das vulnerabilidades mais críticas em aplicações Java. O uso de PreparedStatement, validação de entrada e ORM são estratégias fundamentais para garantir a segurança dos dados e evitar ataques maliciosos.

O SQL Injection é um dos ataques mais perigosos em aplicações web. Empresas que lidam com informações sensíveis, como bancos e e-commerces, precisam garantir que seus sistemas sejam imunes a esse tipo de ataque. O uso correto de PreparedStatement e ORM reduz drasticamente a exposição a essas vulnerabilidades, garantindo maior segurança para os usuários.

Algumas aplicações:

  • Proteção contra ataques maliciosos
  • Garantia da integridade e confidencialidade dos dados
  • Evitar acesso não autorizado ao banco de dados
  • Melhorar a conformidade com normas de segurança

Dicas para quem está começando

  • Sempre utilize PreparedStatement para consultas seguras
  • Evite concatenar valores diretamente nas queries
  • Valide e sanitize as entradas do usuário
  • Use ORM para abstrair o acesso ao banco
  • Monitore os logs para identificar padrões suspeitos
Foto de Rodrigo Farias
Contribuições de
Rodrigo Farias

Desenvolvedor Java focado em aplicações corporativas e microsserviços.

Mais sobre o autor
Compartilhe este tutorial: Como prevenir SQL Injection em Java

Compartilhe este tutorial

Continue aprendendo:

O que é JDBC e como utilizá-lo

O JDBC (Java Database Connectivity) é uma API que permite a comunicação entre aplicações Java e bancos de dados relacionais.

Tutorial anterior

Como usar PreparedStatement em vez de Statement

O uso de PreparedStatement em vez de Statement em Java melhora a segurança contra SQL Injection e otimiza o desempenho das consultas SQL.

Próximo tutorial