И JPQL-инъекции, и SQL-инъекции являются примерами более широкой категории Внедрение кода .
Любой язык , который анализируется во время выполнения, подвержен внедрению кода.
JPQL или Язык запросов персистентности Java похож на SQL в синтаксисе и в том, что он записывается как строки и анализируется во время выполнения.
Сборказапросы, передавая строки запросов JPQL непосредственно в метод createQuery, как показано выше, в JPA называется динамическим построением запросов, поскольку строка запроса может быть построена динамически во время выполнения.
Когда в описании говорится "создается динамически во время выполнения «они означают, что ваш код форматирует запрос JPQL как строку Java, а затем отправляет строку для анализа и выполнения.Поэтому в вашем коде есть возможность комбинировать фиксированные строки с переменным содержимым.
Вот пример безопасного использования параметров для объединения переменной с оператором JPQL.Это происходит от https://www.objectdb.com/java/jpa/query/parameter
SAFE:
TypedQuery<Country> query = em.createQuery(
"SELECT c FROM Country c WHERE c.name = :name", Country.class);
return query.setParameter("name", name).getSingleResult();
Вот тот же запрос, написанный небезопасным способом, объединяющий переменную непосредственно в строку.
UNSAFE:
TypedQuery<Country> query = em.createQuery(
"SELECT c FROM Country c WHERE c.name = '" + name + "'", Country.class);
Не используйте конкатенацию строк для формирования запросов JPQL, если вы можете избежать этого.Вот как небезопасный контент проникает в ваш JPQL.