2014-02-21 8 views
0

Я пытаюсь решить возможный 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 Токен Недействительный

+0

В: Вы можете успешно использовать одну цитату ('), правильно? Если да, в чем проблема? – FoggyDay

+0

Правильная, одинарная кавычка отлично работает. Я пытаюсь защитить запрос, избегая ввода пользователя (см. Ссылку: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet). Они идеально подходят для использования PreparedStatement, но в нашем случае запрос генерируется путем ввода пользователем, поэтому анализ запроса и генерация PreparedStatement является довольно дорогостоящим. Escaping - это еще один способ, и именно поэтому мы заменяем одну кавычку двумя одиночными кавычками. – galina62

ответ

0

Вы пытаетесь предотвратить 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<>' 

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

В качестве альтернативы вы можете ПОДГОТОВИТЬ параметризованный запрос. Это, как правило, более безопасный метод. Он работает намного лучше.

+0

[comic] (https://xkcd.com/327/) и [объяснение] (http://www.explainxkcd.com/wiki/index.php/Little_Bobby_Tables) – WarrenT

+0

Благодарим за сообщение. Я согласен с тем, что PrepareStatement с параметризованным запросом сохранен и лучше выполнен. Наше приложение позволяет пользователю вводить предложение WHERE (пользователь будет вводить WHERE CITY = 'BELLEVUE'). Знаете ли вы какой-либо продукт с открытым исходным кодом, который будет конвертировать пользовательский ввод для параметризации запроса? Я смотрел на SQL Parser, но это коммерческий продукт. – galina62

+0

Вы задаете запрос с вопросительным знаком как маркер места для параметра. Вы готовите этот оператор, затем выполняете его (или открываете его как курсор), подавая пользовательский ввод в качестве значения (ов) параметра. Поскольку он уже подготовлен, синтаксис уже определен; вход пользователя не может быть интерпретирован как что-либо еще. – WarrenT

Смежные вопросы