Я читал, что для предотвращения SQL-инъекций необходимо использовать PreparedStatement.
Означает ли это, что если я использую perparedStatement, никто не сможет выполнить SQL-инъекцию ни на одной из моих страниц? Надежно ли это против SQL-инъекций? Если нет, то, пожалуйста, приведите пример, чтобы продемонстрировать это.
Означает ли использование prepareStatement, что SQL-инъекций не будет?
Ответы (5)
Пока вы на самом деле используете функцию подстановки параметров подготовленного оператора (можно неправильно использовать их и не использовать эту функцию) и при условии, что в используемой вами библиотеке подготовленных операторов нет ошибки, вы должны быть в порядке против необработанных SQL-инъекций. Однако это не означает, что вы не должны относиться с подозрением ко всему, что дает вам пользователь. :-)
подготовленные операторы не охватывают части запроса, не являющиеся данными, — идентификаторы и операторы.
таким образом, если некоторые из них являются переменными и добавляются в запрос напрямую, возможна инъекция.
благодаря ограниченному количеству возможных вариантов все идентификаторы переменных должны выбираться из заранее написанных вариантов на основе пользовательского ввода. то же самое для операторов.
Пользовательский ввод не должен добавляться в запрос напрямую.
Использование функции подготовленного оператора предоставленного языка означает, что вы используете проверенное и проверенное решение проблемы - это не означает, что никогда не будет никаких ошибок или возможностей для SQL-инъекций, но это означает, что вы не единственный человек, использующий эту реализацию. Чем больше людей используют одну и ту же реализацию для чего-то, тем больше шансов найти и устранить ошибки — если вы используете свою собственную реализацию, то только вы можете найти и исправить ошибки.
Хотя подготовленные операторы помогают защититься от SQL-инъекций, существуют возможности атак с использованием SQL-инъекций из-за ненадлежащего использования подготовленных операторов.
В приведенном ниже примере объясняется такой сценарий, когда входные переменные передаются непосредственно в подготовленный оператор, тем самым открывая путь для атак путем внедрения SQL-кода.
String strUserName = request.getParameter("Txt_UserName");
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");
подготовленный оператор может быть уязвим для SQL-инъекций, если он не сделан должным образом.
Краткий ответ: да, если правильно использовать.
Однако это не означает, что в драйвере JDBC не может быть ошибок, открывающихся для SQL-инъекций. Когда я изучил это для компании, в которой я работал, я обнаружил, что действительно была ошибка SQL-инъекции в одном из используемых нами драйверов JDBC (PostgreSQL). Это было несколько лет назад, и ошибка была исправлена.
Хотя я не помню подробностей, я помню, как смотрел исходный код реализации JDBC и видел, что она была реализована с конкатенацией строк.
Однако я ожидаю, что это будет редко, и я бы посоветовал доверять реализации и правильно использовать PreparedStatements.