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