В чем разница между JPQL-инъекцией и SQL-инъекцией

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

1 ответ

Решение

И JPQL-инъекция, и SQL-инъекция являются примерами более широкой категории внедрения кода.

Любой язык, который анализируется во время выполнения, подвержен внедрению кода.

JPQL или Java Persistence Query Language похожи на SQL по синтаксису и в том, что они пишутся как строки и анализируются во время выполнения.

Построение запросов путем передачи строк запросов JPQL непосредственно в метод createQuery, как показано выше, в JPA называется динамическим построением запросов, поскольку строку запроса можно динамически создавать во время выполнения.

Когда в описании написано "динамически создается во время выполнения", это означает, что ваш код форматирует запрос JPQL как строку Java, а затем отправляет строку для анализа и выполнения. Поэтому ваш код имеет возможность комбинировать фиксированные строки с переменным содержимым.

Вот пример безопасного использования параметров для объединения переменной с оператором JPQL. Это из https://www.objectdb.com/java/jpa/query/parameter

БЕЗОПАСНЫЙ:

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.

Другие вопросы по тегам