Означает ли использование readyStatement, что SQL-инъекций не будет?

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

Ответы на вопрос(5)

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

 Moo20 сент. 2010 г., 13:20
Так почему негативный рейтинг? Как насчет моего ответа является ложным или вводящим в заблуждение? Весь смысл использования фреймворка в том, что он широко используется - больше шансов найти и исправить проблемы, больше шансов, что код, который вы используете через фреймворк, доказан. Ваш собственный код может быть когда-либо доказан только вами, и поэтому вы находитесь в невыгодном положении по сравнению с другими реализациями. Так что не так с моей позицией?

существуют возможности атак SQL-инъекций через ненадлежащее использование подготовленных операторов.

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

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

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

 Rakesh Juyal20 сент. 2010 г., 13:35
Я не буду относиться к этому как readyStatement, даже если он говорит con.preparedStatement.
 T.J. Crowder20 сент. 2010 г., 13:52
@Rakesh: Да, но ты бы удивился ... :-)

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

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

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

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

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

Решение Вопроса

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

Ваш ответ на вопрос