Pode ocorrer em qualquer input não tratado, enviado por um cliente, que é utilizado em uma query de banco (podendo ser qualquer operação que receba inputs, e.g.
select
, insert
, update
, ...). Ex.:public class UserController { private DatabaseConnection db = new DatabaseConnection(); public void find(String email, String password) { String query = "select * from users where email = " + email + " and password = " + password; db.execute(query); } } // se algum cliente enviar os seguintes dados: // email = "" or 1=1 --" // password = "any" // então a query irá retornar todos registros da tabela users
Para nos precavermos contra esses ataques podemos inserir o input utilizando
SQL Parameters
, ao invés de concatenação. Ex.:Map<String, Integer> salesForWeek = Map.of("Arabic", 2, "Mongolian", 35); String updateString = "update COFFEES set SALES = ? where COF_NAME = ?"; try (PreparedStatement updateSales = con.prepareStatement(updateString)) { for (var coffe = salesForWeek.entrySet()) { updateSales.setInt(1, e.getValue().intValue()); updateSales.setString(2, e.getKey()); updateSales.executeUpdate(); } } catch (SQLException e) { System.err.print("Erro!"); }
ORMs e ODMs
Quando utilizamos algum framework ou biblioteca para executar as queries, precisamos verificar se não existe nenhum issue aberto em relação a ataques de SQL Injection. Além disso precisamos confirmar que em queries montadas a mão, mas executadas pela ORM ou ODM, a inserção dos inputs esteja sendo feita com SQL Parameters e não com concatenação não gerenciada.