Я прочитал, что для предотвращения SQL Injection необходимо использовать PreparedStatement.
Означает ли это, что если я использую perparedStatement, тогда никто не сможет выполнить SQL Injection на любой моей странице? Является ли он надежным против SQL Injection? Если нет, то, пожалуйста, дайте пример, чтобы продемонстрировать это.Имеет ли использование prepareStatement означает, что SQL-инъекция не будет?
ответ
До тех пор, пока вы действительно используете функцию подстановки параметров подготовленного оператора (возможно, неправильно использовать их, а не использовать эту функцию) и при условии, что в подготовленной библиотеке вы не используете ошибку , то вы должны быть в порядке против сырой инъекции SQL. Это не значит, что вы не должны относиться к тому, что пользователь дает вам с подозрением. :-)
Хотя подготовленные заявления помогают в защите от SQL Injection, есть возможности атак SQL Injection путем ненадлежащего использования подготовленных заявлений.
В приведенном ниже примере объясняется такой сценарий, когда входные переменные передаются непосредственно в подготовленное заявление и тем самым прокладывают путь для атак SQL Injection.
String strUserName = request.getParameter("Txt_UserName");
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");
подготовленное заявление может быть уязвимо для SQL инъекций, если это не сделано должным образом.
Использование подготовленной функции оператора предоставленного языка означает, что вы используете проверенное решение проблемы - это не означает, что никогда не было ошибок или возможностей для возможностей SQL Injection, но что это значит заключается в том, что вы не - это не единственный человек, использующий реализацию. Чем больше людей используют одну и ту же реализацию для чего-то, тем больше шансов найти и устранить ошибки - если вы используете свою собственную реализацию, тогда вы можете найти и исправить ошибки.
Итак, почему отрицательный рейтинг? А как насчет моего ответа ложным или вводящим в заблуждение?Весь смысл использования структуры заключается в том, что ее широко используется - больше шансов найти и устранить проблемы, больше шансов, что код, который вы потребляете через фреймворк, доказан. Ваш собственный код может быть доказан только когда-либо, и, таким образом, вы находитесь в невыгодном положении по сравнению с другими реализациями. Так что случилось с моей позицией? – Moo
подготовленные заявления не охватывают части данных без запроса - идентификаторы и операторы.
Таким образом, если некоторые из них являются переменными и добавляются непосредственно к запросу, возможна инъекция.
Благодаря ограниченному числу возможных вариантов все переменные идентификаторы должны выбираться из предварительно написанных вариантов на основе ввода пользователем. для операторов.
Пользовательский ввод не должен быть добавлен непосредственно к запросу.
Короткий ответ: да, если он используется должным образом.
Однако это не означает, что в драйвере JDBC не может быть ошибок, открывающихся для SQL-инъекции. Когда я посмотрел на это для компании, над которой работал, я обнаружил, что в одном из драйверов JDBC, которые мы использовали (PostgreSQL), действительно была ошибка SQL-инъекций. Это было несколько лет назад, и ошибка была исправлена.
Хотя я не помню специфику, я вспоминаю исходный код реализации JDBC и вижу, что он был реализован с помощью конкатенации строк.
Я бы ожидал, что это будет редкость, и мой совет будет состоять в том, чтобы доверять реализации и правильно использовать PreparedStatements.
- 1. Что значит ... означает? Имеет ли смысл?
- 2. Что означает «коммерческое использование»?
- 3. Что означает, что powershell 2.0 будет «брандмауэром»?
- 4. Что означает «агент не имеет идентичности»?
- 5. Что означает «пользователь не имеет привилегий»?
- 6. Что означает «использование» в Redshift?
- 7. Hibernate prepareStatement не работает
- 8. Что это означает, что язык программирования не имеет стеков?
- 9. Использование ip, что означает LOWER_UP?
- 10. JDBC prepareStatement не работает
- 11. Что означает, что переменная окружения Docker не имеет имени?
- 12. Что означает «Невосприимчивое использование Bootstrap»?
- 13. Python: Что здесь означает использование []?
- 14. Что означает использование Non DFS?
- 15. Что означает * NSFileProtectionComplete * означает?
- 16. Что означает «Ожидается, что он не будет в угловой зоне, но это так!» ошибка означает?
- 17. Что означает использование в C++?
- 18. Что означает оператор? = Означает?
- 19. Что означает «означает»?
- 20. Что означает повторное использование XPath для XML?
- 21. Что означает \ n означает
- 22. Что означает «URI имеет компонент полномочий»?
- 23. Что означает, что таблица MySQL будет вписываться в основную память?
- 24. Что означает, что коллекция будет окончательной в Java?
- 25. Что означает, что NSObjectController будет в режиме Entity?
- 26. Что означает использование проб [диапазон (6), y]
- 27. Что означает «неопределенно устаревшее» означает? PATTERN?
- 28. Что означает: означает значение после Scala?
- 29. Что означает = ++ C5 означает в excel?
- 30. Что означает использование ЦП в базах данных?
Я не буду рассматривать это как подготовленное утверждение, даже если оно говорит con.preparedStatement. –
@ Rakesh: Да, но вы были бы удивлены ... :-) –