EJB3 SQL注入

时间:2012-02-12 00:09:41

标签: java security ejb-3.0 sql-injection prepared-statement

我想知道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注入吗?

2 个答案:

答案 0 :(得分:1)

没有

简单地说,只要您没有动态构建SQL(并且绑定不构建SQL),就不存在SQL注入的风险。除非有错误的SQL驱动程序。

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

不同的驱动程序执行不同的操作,但SQL注入发生的原因是创建SQL文本的人没有采取适当的预防措施来阻止SQL注入(特别是转义特殊字符引用等)。

理想情况下,驱动程序会注意正确构建SQL。但如果司机在某种程度上有错误,那么仍有一些风险。我个人没有遇到一个驱动程序有一个影响这个的bug。所以,虽然它是可能的,但它真的非常非常遥远。

最后,对于您的示例,您甚至不使用SQL,而是使用EQL,这是JPA查询语言。这必须再次从EQL转换为SQL,这为介入软件(JPA和JDBC驱动程序)提供了更多机会防止SQL注入发生。

答案 1 :(得分:0)

JPA调用的所有参数化查询形式都被认为是安全的SQL注入。但是,您可以创建一个带连接的查询字符串,这将是不安全的。