В чем разница между JPQL-инъекцией и SQL-инъекцией - PullRequest
0 голосов
/ 09 февраля 2019

Я читал о внедрении JPQL и SQL.Говорят, что на многих сайтах внедрение ORM почти такое же, как внедрение SQL с точки зрения тестировщиков.Итак, что я хочу знать, так это основные различия между инъекциями JPQL и SQL.

1 Ответ

0 голосов
/ 10 февраля 2019

И 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.

...