Можно ли получить SQL-инъекцию, если PreparedStatement используется без setString? - PullRequest
0 голосов
/ 13 апреля 2019

Допустим, я использую PreparedStatement и передаю вводимые пользователем данные непосредственно в него. Может ли это вызвать SQLi?

Я посмотрел другие ответы на stackoverflow, но никто не объясняет это

Например

String q = '%' + request.getParameter("search") + '%';
PreparedStatement s = s("SELECT * FROM table_name where search="+q);
ResultSet r = s.executeQuery();

В этом случае, как мы видим, не используется ? или setString. Может ли такой код вызывать SQLI?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

В любое время вы объединяете предоставленные пользователем строки для построения оператора SQL, без адекватного экранирования строки, вы подвержены атакам SQL-инъекций.

Ваш код должен быть написан какthis:

String search = request.getParameter("search");

String sql = "SELECT * FROM table_name WHERE search LIKE ?";
try (PreparedStatement s = conn.prepareStatement(sql)) {
    s.setString(1, '%' + search + '%');
    try (ResultSet r = s.executeQuery()) {
        // more code here
    }
}

Обратите внимание на использование LIKE для правильной работы групповых символов и использование try-with-resources для правильного close() ресурсов JDBC.

0 голосов
/ 13 апреля 2019

Да.Злоумышленник может установить для параметра поиска что-то вроде ; DELETE FROM users;.Ваш подготовленный вызов оператора не может знать, что SQL, который вы передаете ему, не является тем, что вы намереваетесь запустить, так как вы строите строку перед вызовом.

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