2010-12-13 30 views
5

的安全问题我开始学习JPA,并且我有大量的遗留EJB2.0代码需要重构才能使用新功能以及我将添加到代码库中的任何新功能。在我的代码中是否需要考虑新的攻击媒介,还是防御性编程会覆盖我?我需要留意的Java持久性API(JPA)

回答

6

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

JPQL注:

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

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

数据库权限:

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

+0

你是否在你的应用层创建PreparedStatements?使用它们(AFAIK)是防止SQL注入的主要防御措施,通常在数据层创建。 – bakoyaro 2010-12-13 18:22:37

+1

好点。如果最佳实践成为习惯,你有时会忘记不好的选择。我将它添加到我的答案中。 – Kdeveloper 2010-12-13 23:59:40

+1

每当你开发一个纯文本协议,俄罗斯黑客利用你的类型安全缺乏。 – 2010-12-14 01:14:08

1

如果您是从一个不受信任的源接收的字节反序列化一个对象,那么它可以导致启动类路径上的任何类加载,无论是否公开,并导致该类初始化运行。它也可以通过具有副作用的构造函数和通过自定义反序列化方法获得权限。

如果你的类路径中包括众所周知的公开课与无限的权力,如Rhino解释附带最近的JVM,或者javax.tools接口javac的,这种权力是通过序列化类的构造函数访问,那么攻击者可以使用它来执行任意的java代码。实际上,这意味着通过java.lang.Runtime具有当前用户的特权的任意用户铃声代码。

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

+1

不知道这是否与JPA有任何关系。 – Kdeveloper 2010-12-14 10:03:10

+0

+1感谢您的意见,他们是有效的担忧。 – bakoyaro 2010-12-14 14:37:50

+0

@Kdeveloper,我的印象是JPA实体需要可序列化。但你说得对;如果您的JPA实体没有使用java序列化进行持久化,那么我的帖子就无关紧要了。 – 2010-12-14 23:18:36