Я пытаюсь решить возможный SQL volnurability с AS400 Перевод. Одним из решений является изменение запроса путем добавления кодировки. EX: "select * from address where city='bellevue' "
будет заменен на: "select * from address where city=''bellevue'' "
. Этот запрос вызывает исключение: java.sql.SQLException:[SQL0101]Token bellevue was not valid. Valid tokens:FOR....
Oracle, MySQL, похоже, не имеет проблем с выполнением того же типа запроса, но DB2/AS400 ему не нравится. Запрос отлично работает только с одним «». Использование JDBC соединение с водителем: com.ibm.as400.access.AS400JDBCDriver. Любая идея почему?db2/AS400 SQLException Токен Недействительный
ответ
Вы пытаетесь предотвратить SQL-инъекцию. Похоже, вы заметили приговор заменить один апостроф ('
) двумя апострофами (''
). Но они говорили только о содержании ввода пользователя, а не о нем.
Давайте посмотрим, как такая атака может работать. Вы даете пользователю поле, в котором вы хотите, чтобы они вводили название города. Вы хотите использовать это значение в своем запросе.
query := "select * from address where upper(city)=upper('" || input_city || ")'"
И тогда вы отправите эту строку запроса, которая будет интерпретироваться сервером базы данных. Все нормально, если они вводят bellvue
или NEW YORK
. Но подумайте о том, что произойдет, если они войдут в Washington's Crossing
, тогда у вас есть проблема. Первая часть строки запроса заканчивается апострофом, чтобы начать строковый литерал, но апостроф в названии города завершит литерал, а s Crossing
вызовет синтаксическую ошибку.
Теперь представьте, что может случиться, если кто-то знал об этом и получил творческий подход к их вкладу? Давайте посмотрим на несколько.
x' or '1'='1
'; select * from tablescatalog where table_name >'
'; delete from customers where name<>'
или некоторые другие ценности, которые могут ухудшить ситуацию. Теперь вы можете понять, почему это поле ввода требует особого внимания при динамическом построении запроса. Вам необходимо обработать невидимые символы, прежде чем использовать их в строке запроса.
В качестве альтернативы вы можете ПОДГОТОВИТЬ параметризованный запрос. Это, как правило, более безопасный метод. Он работает намного лучше.
[comic] (https://xkcd.com/327/) и [объяснение] (http://www.explainxkcd.com/wiki/index.php/Little_Bobby_Tables) – WarrenT
Благодарим за сообщение. Я согласен с тем, что PrepareStatement с параметризованным запросом сохранен и лучше выполнен. Наше приложение позволяет пользователю вводить предложение WHERE (пользователь будет вводить WHERE CITY = 'BELLEVUE'). Знаете ли вы какой-либо продукт с открытым исходным кодом, который будет конвертировать пользовательский ввод для параметризации запроса? Я смотрел на SQL Parser, но это коммерческий продукт. – galina62
Вы задаете запрос с вопросительным знаком как маркер места для параметра. Вы готовите этот оператор, затем выполняете его (или открываете его как курсор), подавая пользовательский ввод в качестве значения (ов) параметра. Поскольку он уже подготовлен, синтаксис уже определен; вход пользователя не может быть интерпретирован как что-либо еще. – WarrenT
- 1. SQLite3 :: SQLException: нераспознанный токен: ":":
- 2. C#, недействительный токен '='
- 3. InstanceID возвращает недействительный токен
- 4. Ошибка: недействительный токен
- 5. instanceof: Недействительный токен
- 6. JSON.parse - недействительный токен
- 7. Dropbox Недействительный токен доступа
- 8. Facebook api - недействительный токен
- 9. APNS: недействительный токен (8)
- 10. com.parse.ParseRequest $ ParseRequestException: недействительный токен сеанса
- 11. Недействительный токен доступа OAuth 2.0
- 12. Android. Parse.com: Недействительный токен сеанса
- 13. Неверный токен и недействительный синтаксис
- 14. Linkedin API недействительный токен доступа
- 15. Недействительный токен LTPA на Websphere
- 16. jquery-tokeninput добавить недействительный токен;
- 17. Twitter oAuth Недействительный токен запроса
- 18. Недействительный токен доступа к facebook?
- 19. Недействительный токен при использовании XPath
- 20. Facebook login - недействительный токен доступа
- 21. Пустой/Недействительный токен в Symfony2
- 22. SYMFONY2 - CSRF токен недействительный Allwais
- 23. Недействительный токен или истек. Запросить новый токен через Tweepy?
- 24. XML :: Простой не правильно сформированный (недействительный токен) токен в строке
- 25. ResetPasswordAsync возвращает «Недействительный токен», когда токен генерируется внутри WebJob
- 26. Как исправить ошибку «Недействительный токен mem-memken (серия/токен)» Ошибка?
- 27. Как недействительный токен доступа добавляет безопасность?
- 28. ASP.NET Identity WebAPI недействительный токен сброса пароля
- 29. Недействительный или неожиданный токен в функции JS
- 30. Многострочная строка, недействительный или неожиданный токен
В: Вы можете успешно использовать одну цитату ('), правильно? Если да, в чем проблема? – FoggyDay
Правильная, одинарная кавычка отлично работает. Я пытаюсь защитить запрос, избегая ввода пользователя (см. Ссылку: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet). Они идеально подходят для использования PreparedStatement, но в нашем случае запрос генерируется путем ввода пользователем, поэтому анализ запроса и генерация PreparedStatement является довольно дорогостоящим. Escaping - это еще один способ, и именно поэтому мы заменяем одну кавычку двумя одиночными кавычками. – galina62