В чем разница между 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.