Возможны ли атаки SQL-инъекций в JPA?

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

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


person Akshay    schedule 09.08.2010    source источник


Ответы (4)


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

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

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

person BalusC    schedule 09.08.2010
comment
Если используется em.persist(user);, где user заполняется, ошибаюсь, пользователем? - person Mr_and_Mrs_D; 08.02.2014
comment
Означает ли это, что следующий запрос является доказательством SQL-инъекций? @Query(SELECT * from table where id = :userID) User getUser (@Param(userID) String userID ) - person Hiren; 12.06.2019

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

person jmj    schedule 09.08.2010
comment
Я бы порекомендовал также ознакомиться со статьей SANS, в ней есть больше примеров/представлений: software-security.sans.org/developer-how-to/ - person eckes; 10.12.2013

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

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

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

Дуг

person Doug Clarke    schedule 09.08.2010

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

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

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

person hantwister    schedule 01.05.2018