2012-12-31 90 views
15

我正在開發一個使用hibernate的應用程序。當我嘗試創建一個登錄頁面時,出現了Sql注入的問題。 我有以下代碼:如何防止SQL注入在休眠?

@Component 
@Transactional(propagation = Propagation.SUPPORTS) 
public class LoginInfoDAOImpl implements LoginInfoDAO{ 

@Autowired 
private SessionFactory sessionFactory;  
@Override 
public LoginInfo getLoginInfo(String userName,String password){ 
    List<LoginInfo> loginList = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName='"+userName+"' and password='"+password+"'").list(); 
    if(loginList!=null) 
     return loginList.get(0); 
    else return null; 
      } 
     } 

我將如何防止在這種情況下SQL注入的創建LOGININFO表的表語法如下:?

create table login_info 
    (user_name varchar(16) not null primary key, 
    pass_word varchar(16) not null); 
+0

請參考此鏈接[1]:http://stackoverflow.com/questions/4606505/prevention-against-sql-injection-in-hibernate –

回答

19
Query q = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName = :name"); 
q.setParameter("name", userName); 
List<LoginInfo> loginList = q.list(); 

你其他有選擇太,從mkyong看這個不錯的article

+0

謝謝,我們如何在查詢中包含密碼?@ Petr Mensik –

+0

以同樣的方式,我包括用戶名 –

0

我們應該總是嘗試使用一般存儲過程來防止SQLInjection。如果存儲過程是不可能的;我們應該嘗試準備好的聲明。

+0

我同意,它在技術上更好,因爲速度。然而,我不知道任何語言的ORM框架會生成存儲過程。如果他們這樣做真的很好。但是由於他們不這樣做,並且ORM框架提供的生產力至關重要,準備好的陳述將佔主導地位。 – Dennis

+0

存儲過程的使用在ORM中並不那麼明智。準備好的陳述應該很好! – Diablo

15

您需要使用命名參數來避免sql注入。此外(與SQL注入無關但通常具有安全性)不會返回第一個結果,但使用getSingleResult因此,如果出於某種原因有多個結果,則查詢將失敗,NonUniqueResultException並且登錄將不會成功的

Query query= sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName=:userName and password= :password"); 
query.setParameter("username", userName); 
query.setParameter("password", password); 
LoginInfo loginList = (LoginInfo)query.getSingleResult(); 
0
  1. 在HQL

    查詢hqlQuery = session.createQuery位置參數( 「從訂單由於訂單其中orders.id =?」);

    List results = hqlQuery.setString(0,「123-ADB-567-QTWYTFDL」)。list();

  2. 在HQL命名參數

    查詢hqlQuery = session.createQuery( 「從僱員爲EMP其中emp.incentive>:激勵」);

    List results = hqlQuery.setLong(「incentive」,new Long(10000))。list();

  3. 在HQL命名參數列表

    列表項=新的ArrayList(); items.add(「book」); items.add( 「時鐘」); items.add( 「墨水」); (「itemList」),item).list();如果我們想要使用它,我們可以使用下面的方法:

  4. 的JavaBean在HQL

查詢hqlQuery = session.createQuery( 「從書籍書籍,其中book.name =:名稱和book.author =:作者」);

列表結果= hqlQuery.setProperties(javaBean)。名單();

  • 本機SQL
  • 查詢的SQLQuery =執行Session.createSQLQuery( 「從圖書,其中作者選擇* =?」);

    List results = sqlQuery.setString(0,「Charles Dickens」)。list();