2012-03-07 82 views
1

在我的java程序中,我使用Hybernate技術訪問MySQL數據庫表中名爲items。該表具有名爲「itemname itemprice itemid」的列&我的java程序具有HQL語句來獲取數據。它還有一個組合框,從項目表中填充。一旦我們從組合框中選擇一個ITEMNAME它會自動補叫了兩個不可編輯jtext領域爲itemid & ITEMPRICE,&程序的其他部分有代碼,以這些JTextField的&得到的字符串值寫入使用POJO類在另一個數據庫中的表名爲訂單的價值。休眠與安全威脅

我想知道,這種程序可以通過SQL注入攻擊???,如果我們使用Hibernate它是安全的SQL注入攻擊??? .... 如果我的程序有安全威脅簡要解釋我怎麼能避免這些...

我在這裏發佈了一些代碼。 這種說法,以填補組合框

String SQL_QUERY = "Select items.iname,items.iid,items.iprice from Item items"; 

此語句填充JTextField的。 「selecteditem」變量是組合框的選定索引。

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'"; 

這種方法在訂單表中的數據寫入

//To send data to the orders table 
private void fillordertable(){ 
    String itemname = (String) jcbItemCode.getSelectedItem(); 
    String itempric = jtfItemPrice.getText(); 
    String tmp = jtfQuantity.getText(); 
    int itemqty = Integer.parseInt(tmp); 
    String temp = jtfUnitPrice.getText(); 
    double unitpric = Double.parseDouble(temp); 
    Session session = null; 

    //This variables for validating purposes 
    String tempcname = jtfName.getText(); 
    String tempcemail = jtfEmail.getText(); 
    if(tempcname.equals("") || tempcemail.equals("")){ 
     jtaDisplay.setText("Check * fields"); 
    } 
    else{ 
    try{ 
    SessionFactory sessionFactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory(); 
    session =sessionFactory.openSession(); 
    session.beginTransaction(); 

    Order order = new Order(); 
    order.setItcode(itemcode); 
    order.setItdiscription(itemdis); 
    order.setItqty(itemqty); 
    order.setItemprice(unitpric); 
    order.setTotprice(unitpric * itemqty); 
    order.setOstatus("Placed"); 

    session.save(order); 
    session.getTransaction().commit(); 
    } 
    catch(Exception exc){ 
    jtaDisplay.setText(exc.getMessage()); 
    } 
    finally{ 
    session.flush(); 
    session.close(); 
    } 
    jtaDisplay.setText("Order & customer tables updated successfully !!!"); 
} 
} 

這是很難理解我的整個代碼,如果我在這裏發佈。所以我發佈了一些我認爲有助於回答我的問題的代碼。如果這還不夠,請評論。

謝謝!

+0

向我們展示一些代碼,也許我們可以顯示哪些部分容易受到sql注入的影響。 – 2012-03-07 18:31:43

+0

我已經發布了一些代碼 – Grant 2012-03-07 18:48:50

回答

4
String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'"; 

易受sql注入影響,如果selectedItem是用戶輸入的數據。

生成SQL或者HQL查詢,通過連接字符串是一般的差的形式,並可能導致SQL注入的可能性。

安全的方法是在任何SQL或HQL中使用命名參數。

在你的榜樣,這似乎是SQL中,獲得一個Hibernate會話,像後:

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = :selecteditem";  
SQLQuery query = session.createSQLQuery(SQL_QUERY);  
query.setParameter("selecteditem", selecteditem); 
List<Object[]> results = query.list(); 

應該大約要編寫和執行查詢的方式。

類似的事情適用於HQL。

如果您只是連接字符串,黑客輸入的惡意值將成爲您的查詢的一部分,並且可能會造成可怕的結果。

如果這不是一個Web表單,而是一個桌面應用程序,那麼您可能完全控制了可以進入此變量的值,但仍然建議您嘗試正確執行這些操作。

命名參數的另一個影響是參數化的sql可以緩存並重用於參數的不同值。所以即使沒有安全考慮,這也是一個好主意。

+0

「selectedItem」是組合框的選定索引。這是一種威脅嗎? – Grant 2012-03-07 19:15:28

+1

這可能是一種威脅,取決於表單的編碼方式。如果這是一個網頁表單,那麼濫用者可能會提供該值,也許可以通過javascript調用繞過正常的表單提交流程。 – 2012-03-07 19:26:14

+0

我該如何防止?這不是一個Web表單,這是一個簡單的桌面應用程序。 – Grant 2012-03-07 19:28:29

3

,如果你是用HQL文本的其餘部分串聯字段值創建HQL,你有問題。如果你正在使用HQL(正確)和所有字段值的替換變量,那麼你很好。 (顯然可以有更多的話要說這個,但沒有更多的細節來自OP,這是我們現在可以說的全部)。另外,如果你插入/更新邏輯純粹是使用POJO,那麼你很好。

UPDATE:

現在你已經張貼一些代碼

,是你有問題。你應該在你的HQL中使用命名參數。 (儘管你寫的代碼很好)。