Java ejb3sql注入
我想知道EJB3在防止SQL注入方面有多安全。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
我已经了解到使用准备好的语句是相当安全的,但例如使用这样的函数
@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,但这与这个问题无关。