2010-09-20 4 views
10

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

ответ

10

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

2

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

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

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

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

+1

Я не буду рассматривать это как подготовленное утверждение, даже если оно говорит con.preparedStatement. –

+1

@ Rakesh: Да, но вы были бы удивлены ... :-) –

3

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

+1

Итак, почему отрицательный рейтинг? А как насчет моего ответа ложным или вводящим в заблуждение?Весь смысл использования структуры заключается в том, что ее широко используется - больше шансов найти и устранить проблемы, больше шансов, что код, который вы потребляете через фреймворк, доказан. Ваш собственный код может быть доказан только когда-либо, и, таким образом, вы находитесь в невыгодном положении по сравнению с другими реализациями. Так что случилось с моей позицией? – Moo

4

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

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

2

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

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

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

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

Смежные вопросы