2012-02-12 72 views
0

我想知道EJB3对于防止SQL注入有多安全。
我读过使用预处理语句是相当安全的,但比如像这样EJB3 SQL注入

@Override 
public Collection<Project> searchProjectsPerProfessorLastname(String lastname) { 
    Query q = manager.createQuery("SELECT DISTINCT OBJECT(p) FROM Project p JOIN p.professors prof WHERE lower(prof.lastName) = ?1"); 
    q.setParameter(1, lastname.toLowerCase()); 
    @SuppressWarnings("unchecked") 
    Collection<Project> c = q.getResultList(); 
    if(c.size()==0) 
     return null; 
    return c; 
} 

就可以进行SQL注入的功能?

+0

你展示什么是JPA,而不是EJB。它可能是使用JPA的EJB bean,但这与此问题无关。 – 2012-02-13 09:16:46

回答

1

简单地说,只要你不是构建SQL动态(和有约束力的不构建SQL),没有SQL注入的风险。除了一个错误的SQL驱动程序。

绑定是通过驱动程序,而不是通过简单地建立自己的SQL文本参数分配给SQL语句的技术。

不同的驱动做不同的事情,但SQL注入情况的原因是人们创造的SQL文本不采取适当的预防措施,以防止SQL注入(尤其是逃逸的特殊字符都引号和等)。

理想的情况下,司机会照顾才能正确地构建SQL。但是,如果司机在某种程度上是越野车,那么仍然存在一些风险。我个人没有遇到过一个驱动程序有一个bug影响了这一点。所以,虽然有可能,但它确实非常遥远。

最后,你比如,你甚至不使用SQL,你正在使用EQL,这是JPA的查询语言。这必须再次从EQL转换为SQL,这为干预软件(JPA和JDBC驱动程序)提供了更多机会来防止发生SQL注入。 JPA电话

+0

清晰完整的答案。谢谢。 – Simon 2012-02-12 12:26:57

+0

这不是EQL,它是JPQL ... – 2012-02-13 09:14:59

0

所有parametized查询形式被认为是对SQL注入安全。但是,您可以创建一个连接的查询字符串,这将是不安全的。