Проблема SQL-инъекции в коде Java - PullRequest
0 голосов
/ 07 мая 2018

Ниже приведен основной метод, который показывает недостаток внедрения 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 различных параметров, которые будут установлены динамически, что приведет к накладным расходам, так как будет много запросов.

1 Ответ

0 голосов
/ 07 мая 2018

Поскольку мой параметр имени является динамическим, я не могу установить его с подготовленным состоянием.

Конечно, вы можете просто обработать текст SQL и параметры динамически одновременно.

Вы также должны использовать try-with-resources , чтобы правильно закрыть объекты Connection, PreparedStatement и ResultSet.

boolean flag = false;
String subName = "abhi";

try (Connection c = DriverManager.getConnection("url","user", "password")) {
    String sql = "SELECT *" +
                  " FROM xyz" +
                 " WHERE name " + (flag ? "LIKE '%'"
                                        : "= LOWER(?)");
    try (PreparedStatement s = c.prepareStatement(sql)) {
        if (! flag)
            s.setString(1, subName);
        try (ResultSet rs = s.executeQuery()) {
            while (rs.next()) {
                System.out.println(":"+rs.getString(1));
            }
        }
    }
} catch (SQLException se) {
    se.printStackTrace();
}

К вашему сведению: WHERE name LIKE '%' - это то же самое, что и WHERE name IS NOT NULL, что совпадает с предложением WHERE, если столбец name не имеет значения null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...