Hibernate&安全威胁

时间:2012-03-07 18:28:55

标签: java mysql hibernate sql-injection

在我的java程序中,我使用Hybernate技术来访问名为items的MySQL数据库表。该表的列名为“itemname itemprice itemid”&我的java程序有HQL语句来获取数据。它还有一个组合框,从items表填充。一旦我们从组合框中选择了一个项目名称,它就会自动填充两个名为itemid&的不可编辑的jtext字段。迭代,&该程序的另一部分有代码从这些jtextfields&获取字符串值。使用POJO类将这些值写入另一个名为orders的数据库表中。

我想知道这种程序可以被sql注入攻击???,如果我们使用Hibernate它是安全的sql注入攻击??? .... 如果我的程序有安全威胁,请简要说明如何避免这些......

我在这里发布一些代码。 此语句用于填充组合框

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

此声明填充jtextfields。 “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 !!!");
}
}

如果我在这里发布,很难理解我的整个代码。所以我发布了一些我认为有助于回答我的问题的代码。如果这还不够,请评论。

谢谢!

2 个答案:

答案 0 :(得分:4)

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'";
如果selectedItem是用户输入的数据,

容易受到sql注入。

通过连接字符串生成SQL或HQL查询通常是不好的形式,并且可能导致sql注入的可能性。

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

在您的示例中,在获取Hibernate会话后似乎是SQL,类似于:

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。

如果您只是连接字符串,那么黑客在famous xkcd中输入的邪恶值就会成为您查询的一部分,并且可以做很糟糕的事情。

如果这不是Web表单而是桌面应用程序,您可能完全控制可以进入此变量的值,但仍然建议您尝试正确执行这些操作。

命名参数的另一个影响是参数化的sql可以被缓存并重用于参数的不同值。所以即使没有安全问题,这也是一个好主意。

答案 1 :(得分:3)

如果您通过将字段值与其余的HQL文本连接来创建HQL,则会出现问题。如果您正在使用HQL(正确)替换变量用于所有字段值,那么您没问题。 (显然可以有更多的说法,但没有来自OP的更多细节,这就是我们现在可以说的全部内容)。另外,如果你插入/更新逻辑纯粹是使用POJO,那么你就可以了。

更新:

现在你发布了一些代码,是的,你有问题。您应该在HQL中使用命名参数。 (但你的写代码很好)。