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

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


person Rakesh Juyal    schedule 20.09.2010    source источник


Ответы (5)


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

person T.J. Crowder    schedule 20.09.2010

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

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

person Your Common Sense    schedule 20.09.2010

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

person Moo    schedule 20.09.2010
comment
Так почему отрицательный рейтинг? Как насчет того, чтобы мой ответ был ложным или вводящим в заблуждение? Весь смысл использования фреймворка в том, что он широко используется — больше шансов найти и исправить проблемы, больше шансов, что код, который вы используете через фреймворк, проверен. Ваш собственный код может быть проверен только вами, и, таким образом, вы находитесь в невыгодном положении по сравнению с другими реализациями. Так что не так с моей позицией? - person Moo; 20.09.2010

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

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

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

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

person Faisal Feroz    schedule 20.09.2010
comment
я не буду рассматривать это как подготовленное заявление, даже если оно говорит con.preparedStatement. - person Rakesh Juyal; 20.09.2010
comment
@Rakesh: Да, но ты удивишься... :-) - person T.J. Crowder; 20.09.2010

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

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

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

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

person Vetle    schedule 20.09.2010