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 deStatement
. - 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.
Por que a proteção contra SQL Injection é essencial para segurança de aplicações Java?
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

Rodrigo Farias
Desenvolvedor Java focado em aplicações corporativas e microsserviços.
Mais sobre o autor