Возможны ли инъекции SQL в JPA? - PullRequest
39 голосов
/ 09 августа 2010

Я создаю веб-приложение на Java, используя Java EE 6 и JSF-2.0, используя API постоянства для всех операций с базой данных.

Серверная часть - MySQL, но я использовал функции EntityManager иИменованные запросы в EJB-QL для всех операций.Возможны ли в этом случае атаки с использованием SQL-инъекций?

Ответы [ 4 ]

40 голосов
/ 09 августа 2010

Это возможно только в том случае, если вы встраиваете контролируемые пользователем переменные в строку SQL / JPQL следующим образом:

String sql = "SELECT u FROM User u WHERE id=" + id;

Если вы этого не делаете и используете только параметризированные / именованные запросы,ты в безопасности.

11 голосов
/ 09 августа 2010

Да, это возможно. Это зависит от того, как вы реализуете.
Посмотрите на Предотвращение внедрения на языке запросов JPA .

5 голосов
/ 09 августа 2010

Если ваш JPA-провайдер обрабатывает все входные аргументы для обработки атак с использованием инъекций, тогда вы должны быть защищены.Мы делаем тонкость в EclipseLink.

Как упоминалось в предыдущем постере, объединение ваших собственных JPQL или SQL (для собственных запросов) может вас раскрыть.

Я бы рекомендовал использовать именованные запросы с параметрами вместо конкатенации строк для построения JPQL / SQL.

Doug

0 голосов
/ 02 мая 2018

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

blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42

Если жертва использует реализацию JPA> = 2.1, а серверная база данных - Oracle, что-то похожее на приведенное выше может действовать как логическая инъекция SQL, сообщающая, что пользователь базы данных начинает с «A».

...