JPA похож на JDBC: бэкэнд-технология.Те же самые проблемы безопасности, которые относятся к JDBC, относятся и к JPA.Таким образом, большая часть соображений безопасности будет реализована на уровне приложений или обрабатывается интерфейсными API.Но на самом деле JPQL-инъекция очевидна.
JPQL-инъекция:
Так же, как при использовании SQL или JDBC API, вы никогда не должны добавлять напрямуюваши параметры в строке запроса.Вы должны работать с setParameter для объекта Query (применяется как к adhoc, так и к именованным запросам), или вы можете использовать API критериев JPA (хотя именованные запросы обеспечивают лучшую производительность).
Query query = em.createQuery("DELETE Order WHERE customer = :customer");
query.setParameter("customer", customer);
query.executeUpdate();
Права базы данных:
Для дополнительной безопасности вы можете создать несколько постоянных единиц (PU), чтобы влияние любых нарушений безопасности было ограничено.Например, вы можете создать несколько PU с разными правами доступа к базе данных: один с правами на обновление, а другой с доступом только для чтения.Просто осознайте, что подобные решения повлияют на дизайн вашего приложения.