繁体   English   中英

EJB3 SQL注入

[英]EJB3 SQL Injection

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

没有。

简而言之,只要您不动态构建SQL(绑定也不构建SQL),就不会有SQL注入的风险。 除非存在错误的SQL驱动程序。

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

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

理想情况下,驱动程序会注意正确构建SQL。 但是,如果驱动程序在某些方面存在问题,则仍然存在一定的风险。 我个人没有遇到驱动程序有错误影响此错误。 因此,尽管有可能,但它确实非常遥远。

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

所有JPA调用的参数化查询形式都被认为可以防止SQL注入。 但是,您可以使用串联创建查询字符串,这是不安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM