我想知道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 :(得分:1)
没有
简单地说,只要您没有动态构建SQL(并且绑定不构建SQL),就不存在SQL注入的风险。除非有错误的SQL驱动程序。
绑定是通过驱动程序为SQL语句分配参数的技术,而不是通过自己简单地构建SQL文本。
不同的驱动程序执行不同的操作,但SQL注入发生的原因是创建SQL文本的人没有采取适当的预防措施来阻止SQL注入(特别是转义特殊字符引用等)。
理想情况下,驱动程序会注意正确构建SQL。但如果司机在某种程度上有错误,那么仍有一些风险。我个人没有遇到一个驱动程序有一个影响这个的bug。所以,虽然它是可能的,但它真的非常非常遥远。
最后,对于您的示例,您甚至不使用SQL,而是使用EQL,这是JPA查询语言。这必须再次从EQL转换为SQL,这为介入软件(JPA和JDBC驱动程序)提供了更多机会防止SQL注入发生。
答案 1 :(得分:0)
JPA调用的所有参数化查询形式都被认为是安全的SQL注入。但是,您可以创建一个带连接的查询字符串,这将是不安全的。