我想知道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注入吗?
发布于 2012-02-12 08:23:46
不是的。
简而言之,只要不是动态构建SQL (并且绑定不是在构建SQL),就不存在SQL注入的风险。除非有错误的SQL驱动程序。
绑定是一种通过驱动程序将参数分配给SQL语句的技术,而不是通过自己简单地构建SQL文本。
不同的驱动程序做不同的事情,但是发生SQL注入的原因是创建SQL文本的人没有采取适当的预防措施来防止SQL注入(特别是转义引号之类的特殊字符)。
理想情况下,驱动程序会注意正确地构建SQL。但如果司机在某种程度上有缺陷,仍然存在一些风险。就我个人而言,我还没有遇到过有bug影响这一点的驱动程序。所以,虽然这是可能的,但它真的非常,非常遥远。
最后,对于您的示例,您甚至没有使用SQL,您使用的是EQL,这是JPA查询语言。这必须再次从EQL转换为SQL,这为中间软件(JPA和JDBC驱动程序)提供了更多机会来防止SQL注入的发生。
发布于 2012-02-12 08:24:25
JPA调用的所有参数化查询表单都被认为是安全的,不会受到SQL注入的影响。但是,您可以使用连接来创建查询字符串,这将是不安全的。
https://stackoverflow.com/questions/9245225
复制相似问题