Boa tarde pessoal. Perdão se esse tópico já existir. Estou com uma dúvida sobre o tratamento de SQL Injection. Tenho uma aplicação com as queries em strings, como: “SELECT * FROM Pessoas WHERE CodPessoa=’”+ codigo +"’";
Os meios de SQL Injection que eu vi consistem em você colocar uma aspa simples e em seguida comentar o resto da query com – ou colocar um comando SQL (Tipo OR 1=1). Mas minha dúvida é: Se eu fizer algo do tipo codigo.replace("’", “”); (Eliminando qualquer aspas simples da entrada do usuário) já não é suficiente para evitar o problema?
@Alexis_Cesar Olá, pq vc não usa o PreparedStatement ele já evita esse tipo de sql injection? Se vc estiver usando o Hibernate a interface Query já tem esse recurso tambem
1 curtida
Dei uma olhada rápida, acho que é melhor usar esses PreparedStatements mesmo, só não sei se entendi direito como funciona. Consegue mandar um exemplo? Se não for pedir demais, é claro.
Aqui um exemplo com select
try (Connection conn = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1:5432/test", "postgres", "password"){
//Exemplo usando o select
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM usuarios WHERE id_usuario=? AND senha=?");//onde as interrogações indicam quais parametros vai ser setado posteriormente
//aqui vc set os valores de acordo com tipo da coluna equivalente, especificando a ordem do indice,
// por exemplo a coluna abaixo vc esta setando o primeiro parametro que vc colocou como interrogação + o valor idUsuario que é inteiro, nesse caso tem que o tipo dessa coluna no banco e procurar na net o equivalente em java, exemplo, o nvarchar o equivalente seria String, entendeu?
stmt.setInt(1, idUsuario);
stmt.setString(2, senha);
ResultSet rs = stmt.executeQuery();
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
Aqui um exemplo com insert
String SQL_INSERT = "INSERT INTO EMPREGADO (NOME, SALARIO, DATA_CRIACAO) VALUES (?,?,?)";
try (Connection conn = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1:5432/test", "postgres", "password"){
PreparedStatement preparedStatement = conn.prepareStatement(SQL_INSERT)) {
preparedStatement.setString(1, "Alexis");
preparedStatement.setBigDecimal(2, new BigDecimal(799.88));
preparedStatement.setTimestamp(3, Timestamp.valueOf(LocalDateTime.now()));
//executo essa chamada para efetuar de fator a inserção
int row = preparedStatement.executeUpdate();
// resultado numero de linhas afetadas, nesse caso nem sempre é 1 pode ser maior
System.out.println(row); //1
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
2 curtidas
Entendi!! Muito obrigado pela ajuda e pelos exemplos!
1 curtida