предотвратить инъекцию SQL в части "Order By" оракула - PullRequest
16 голосов
/ 30 января 2012

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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 30 января 2012

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

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

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

3 голосов
/ 30 января 2012

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

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

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

1 голос
/ 30 января 2012

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

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

...