Означает ли использование readyStatement, что SQL-инъекций не будет? - PullRequest
10 голосов
/ 20 сентября 2010

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

Ответы [ 5 ]

10 голосов
/ 20 сентября 2010

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

4 голосов
/ 20 сентября 2010

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

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

3 голосов
/ 20 сентября 2010

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

2 голосов
/ 20 сентября 2010

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

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

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

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

2 голосов
/ 20 сентября 2010

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

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

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

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

...