Java ejb3sql注入

Java ejb3sql注入,java,security,ejb-3.0,sql-injection,prepared-statement,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

我想知道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;
}
@覆盖
公共集合searchProjectsPerProfessorLastname(字符串lastname){
Query q=manager.createQuery(“从项目p中选择不同的对象(p)JOIN p.prof,其中lower(prof.lastName)=?1”);
q、 setParameter(1,lastname.toLowerCase());
@抑制警告(“未选中”)
集合c=q.getResultList();
如果(c.size()==0)
返回null;
返回c;
}
是否可以执行SQL注入?

简单地说,只要您不是动态构建SQL(绑定也不是构建SQL),就没有SQL注入的风险。除非有bug的SQL驱动程序

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

不同的驱动程序做不同的事情,但是SQL注入发生的原因是,创建SQL文本的人没有采取适当的预防措施来防止SQL注入(特别是转义特殊字符,如引号等)

理想情况下,驱动程序会注意正确地构建SQL。但如果司机在某种程度上是有车的,那还是有风险的。一、 就我个人而言,还没有遇到一个驱动程序有一个bug影响了这一点。所以,虽然这是可能的,但它确实非常遥远


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

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

您显示的是JPA,而不是EJB。它可能是一个使用JPA的EJB bean,但这与这个问题无关。