使用Java Persistence API(JPA)需要注意哪些安全问题

时间:2010-12-13 16:07:55

标签: java security jpa java-ee

我开始学习JPA,并且我有大量遗留的EJB2.0代码需要重构才能使用新功能,以及我将添加到代码库的任何新功能。我的代码中是否需要考虑新的攻击向量,或者防御性编程会覆盖我吗?

2 个答案:

答案 0 :(得分:6)

JPA就像JDBC:后端技术。适用于JDBC的相同安全问题适用于JPA。因此,大多数安全性考虑将在应用程序级别实现或由前端API处理。但事实上,JPQL注入是一个你应该注意的明显问题。

JPQL注入:

就像使用SQL或JDBC API一样,您不应该直接将参数添加到查询字符串中。您应该使用Query对象上的setParameter(适用于adhoc和命名查询),或者您可以使用JPA criteria API(尽管命名查询提供最佳性能)。

Query query = em.createQuery("DELETE Order WHERE customer = :customer");
query.setParameter("customer", customer);
query.executeUpdate();

数据库权利:

为了提高安全性,您可以创建多个持久性单元(PU),因此任何安全漏洞的影响都是有限的。例如,您可以创建具有不同数据库访问权限的多个PU:一个具有更新权限,另一个具有只读查询访问权限。只要意识到这样的决定会影响你的应用程序设计。

答案 1 :(得分:1)

如果要从不受信任的源接收的字节反序列化对象,则可能导致引导类路径上的任何类加载(无论是否公共),并导致该类初始化运行。它还可以通过具有副作用的构造函数和自定义反序列化方法获得权限。

如果您的类路径包含具有无限权限的众所周知的公共类,例如最新JVM附带的Rhino解释器,或javac的javax.tools接口, AND ,则可以通过构造函数访问该权限。一个可序列化的类,然后攻击者可以使用它来执行任意java代码。实际上,这意味着通过java.lang.Runtime具有当前用户权限的任意用户环代码。

第一个标准很容易实现。第二个可能不太容易满足。

相关问题