Может ли использование prepareStatement означать, что SQL-инъекция не будет?

Я прочитал, что для предотвращения SQL Injection необходимо использовать PreparedStatement.
Означает ли это, что если я использую perparedStatement, тогда никто не сможет выполнить SQL Injection на любой моей странице? Является ли он надежным против SQL Injection? Если нет, пожалуйста, дайте пример, чтобы продемонстрировать это.

Ответ 1

Пока вы используете функцию подстановки параметров подготовленного оператора (возможно, неправильно использовать их и не использовать эту функцию), и при условии, что в подготовленной библиотеке вы не используете ошибку, то вы должны быть в порядке против сырой инъекции SQL. Это не значит, что вы не должны относиться к тому, что пользователь дает вам с подозрением.: -)

Ответ 2

Подготовленные инструкции

не охватывают не-данные частей запроса - идентификаторы и операторы.
таким образом, если некоторые из них являются переменными и непосредственно добавляются в запрос, возможна инъекция.

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

Ответ 3

Использование подготовленной функции оператора предоставленного языка означает, что вы используете проверенное и проверенное решение проблемы - это не означает, что никогда не было никаких ошибок или возможностей для возможностей SQL Injection, но то, что это значит, заключается в том, что вы не единственный человек, использующий эту реализацию. Чем больше людей используют одну и ту же реализацию для чего-то, тем больше шансов найти и устранить ошибки - если вы используете свою собственную реализацию, тогда вы можете найти и исправить ошибки.

Ответ 4

Несмотря на то, что подготовленные утверждения помогают защищать от SQL Injection, есть возможности атак SQL Injection через ненадлежащее использование подготовленных заявлений.

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

String strUserName = request.getParameter("Txt_UserName"); 
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");

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

Ответ 5

Короткий ответ: да, если он используется правильно.

Однако это не означает, что в драйвере JDBC не может быть ошибок, открывая для SQL-инъекции. Когда я посмотрел на это для компании, над которой работал, я обнаружил, что в одном из драйверов JDBC, которые мы использовали (PostgreSQL), действительно была ошибка SQL-инъекций. Это было несколько лет назад, и ошибка была исправлена.

Хотя я не помню специфику, я вспоминаю исходный код реализации JDBC и вижу, что он был реализован с помощью конкатенации строк.

Я бы ожидал, что это будет редкостью, и мой совет будет состоять в том, чтобы доверять реализации и правильно использовать PreparedStatements.