предотвратить инъекцию sql в порядке оракула по частям

Чтобы получить некоторые данные, я создаю sql-запрос :)
Конечно, есть некоторая фильтрация и упорядочение частей.

Чтобы получить результат, я использую «NamedParameterJdbcTemplate», и когда мне нужно что-то добавить в часть «где», я использую карту параметров, чтобы предотвратить внедрение.

Но с частью «упорядочить по» все по-другому, так как нет автоматического экранирования (и это часть sql). Эта часть заказа иногда заполняется данными от пользователя (напрямую), иногда добавляются дополнительные параметры сортировки из кода. Есть одна проблема: иногда это поле сортировки содержит не только имя столбца, но и выражение sql.

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

Каков наилучший способ предотвратить инъекции sql в части сортировки запроса, когда вы используете шаблон jdbc?


person Dainius    schedule 30.01.2012    source источник
comment
Можно использовать PreparedStatement?   -  person Romain    schedule 30.01.2012
comment
Я не знаю о jdbc, но можно использовать переменную связывания в order by в Oracle.   -  person Ben    schedule 30.01.2012
comment
PreparedStatement будет избегать только параметров фильтрующей части (где), не нашел, как избежать части сортировки. Может быть, у вас есть какой-то очень короткий пример?   -  person Dainius    schedule 30.01.2012
comment
можете ли вы сделать заказ в своем приложении после получения несортированных данных? (Я знаю, что было бы лучше иметь его в запросе)   -  person A.B.Cade    schedule 30.01.2012
comment
как насчет того, чтобы снять что-нибудь после ; в пользовательском вводе (или отклонить все вместе, если содержит;)? И убедитесь, что у этого пользователя есть только избранные привилегии. В любом случае хорошее начало.   -  person tbone    schedule 30.01.2012
comment
Нужно проверить это, но, вероятно, это невозможно, так как в сортировке, вероятно, есть некоторые данные, которые не извлекаются при выборе (например, порядок (выберите значение из extra_table, где id=table_from_select.refId и c='некоторое значение') )   -  person Dainius    schedule 30.01.2012
comment
tbone, нечто подобное уже есть. Проблема в том, что некоторые причудливые заказы имеют символы, которые теперь удалены, и ';' может находиться внутри некоторого строкового значения.   -  person Dainius    schedule 30.01.2012
comment
@Dainius Я бы серьезно подумал о том, чтобы НЕ разрешать пользователю передавать ';' ru говорит, что order by может законно содержать ';'? Можете ли вы опубликовать пример?   -  person tbone    schedule 30.01.2012
comment
Не допускается то, что я говорил, что точка с запятой ';' может быть частью текста (теоретически), например. упорядочить по (выбрать значение из extra_table, где id=table_from_select.refId и c='какое-то значение; какое-то другое значение'). Но так как риск слишком высок, разрешены только некоторые основные символы (буквенно-цифровые, подчеркивание и некоторые другие).   -  person Dainius    schedule 30.01.2012


Ответы (3)


Чтобы защититься от SQL-инъекций на стороне базы данных, взгляните на DBMS_ASSERT встроенный пакет Oracle: http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm

Возможно, вы обнаружите, что функция SIMPLE_SQL_NAME поможет защитить ваше предложение ORDER BY от SQL-инъекций.

Надеюсь, поможет...

person Ollie    schedule 30.01.2012
comment
Это, вероятно, лучше, чем использовать пользовательскую функцию экранирования. Если не будет возможности сделать это с какой-то библиотекой (jdbctemplate или что-то подобное), возможно, так и будет. - person Dainius; 30.01.2012

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

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

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

person Vincent Malgrat    schedule 30.01.2012

Один из способов, который я использовал по несколько иным причинам, заключался в использовании Order By 3,2 (3-й столбец, второй столбец).

Поэтому, если вы можете определить имя столбца, введенное пользователем в столбцах вывода, косвенность должна убить вектор внедрения.

person Tony Hopkinson    schedule 30.01.2012
comment
проблема в том, что иногда это поле сортировки содержит не только имя столбца, но и оператор sql - person Dainius; 30.01.2012
comment
Пользователь ввел оператор sql? - person Tony Hopkinson; 30.01.2012
comment
Не то чтобы напрямую, у некоторых ссылок есть параметр, который передается на заказ по частям. Первым предположением, которое нужно исправить, было создание карты разрешенных полей сортировки и получение этого поля по параметру для URL-адреса в качестве ключа, что-то похожее (или то же самое), что предложил Винсент. Но есть и старый код, который не очень хотелось бы модифицировать (кто знает, сколько он проживет), и есть sql. И может быть какое-то другое место, где используется этот параметр порядка. - person Dainius; 31.01.2012