Ниже приведен основной метод, который показывает недостаток внедрения SQL (поскольку здесь выполняется конкатенация строк) при сканировании на предмет стандартов / правил кодирования.
public static void main(String[] args) {
boolean flag = false;
String name = "";
String subName = "abhi";
try {
Class.forName("org.postgresql.Driver");
Connection c = DriverManager.getConnection("url","user", "password");
if(flag==true){
name = "LIKE '%'";
} else {
name = "= LOWER('" + subName + "')";
}
Statement s = c.createStatement();
String query = "SELECT * FROM xyz WHERE name "+name;
ResultSet rs = s.executeQuery(query);
while(rs.next()){
System.out.println(":"+rs.getString(1));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException se) {
se.printStackTrace();
}
}
Я хочу удалить недостаток SQL-инъекции. Поскольку мой параметр name
является динамическим, я не могу установить его с помощью preparedStatement
. Что может быть оптимальным решением для этого?
ПРИМЕЧАНИЕ : Использование 2 разных запросов в блоке if-else
не решит задачу, так как у меня есть 7 различных параметров, которые будут установлены динамически, что приведет к накладным расходам, так как будет много запросов.