2012-02-12 73 views
0

我想知道EJB3對於防止SQL注入有多安全。
我讀過使用預處理語句是相當安全的,但比如像這樣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

你展示什麼是JPA,而不是EJB。它可能是使用JPA的EJB bean,但這與此問題無關。 – 2012-02-13 09:16:46

回答

1

簡單地說,只要你不是構建SQL動態(和有約束力的不構建SQL),沒有SQL注入的風險。除了一個錯誤的SQL驅動程序。

綁定是通過驅動程序,而不是通過簡單地建立自己的SQL文本參數分配給SQL語句的技術。

不同的驅動做不同的事情,但SQL注入情況的原因是人們創造的SQL文本不採取適當的預防措施,以防止SQL注入(尤其是逃逸的特殊字符都引號和等)。

理想的情況下,司機會照顧才能正確地構建SQL。但是,如果司機在某種程度上是越野車,那麼仍然存在一些風險。我個人沒有遇到過一個驅動程序有一個bug影響了這一點。所以,雖然有可能,但它確實非常遙遠。

最後,你比如,你甚至不使用SQL,你正在使用EQL,這是JPA的查詢語言。這必須再次從EQL轉換爲SQL,這爲干預軟件(JPA和JDBC驅動程序)提供了更多機會來防止發生SQL注入。 JPA電話

+0

清晰完整的答案。謝謝。 – Simon 2012-02-12 12:26:57

+0

這不是EQL,它是JPQL ... – 2012-02-13 09:14:59

0

所有parametized查詢形式被認爲是對SQL注入安全。但是,您可以創建一個連接的查詢字符串,這將是不安全的。