休眠和安全威胁

Gra*_*ant 1 java mysql hibernate sql-injection

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

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

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

String SQL_QUERY = "Select items.iname,items.iid,items.iprice from Item items";
Run Code Online (Sandbox Code Playgroud)

此语句填充 jtextfields。“selecteditem”变量是组合框的选定索引。

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'";
Run Code Online (Sandbox Code Playgroud)

此方法将数据写入订单表中

 //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 !!!");
}
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Don*_*oby 5

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'";
Run Code Online (Sandbox Code Playgroud)

如果selectedItem是用户输入的数据,则容易受到 sql 注入的影响。

通过连接字符串生成 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();
Run Code Online (Sandbox Code Playgroud)

应该与您想要编码和执行查询的方式大致相同。

类似的事情也适用于 HQL。

如果您只是连接字符串,黑客在著名的 xkcd 中输入的邪恶值将成为您查询的一部分,并且可能会做一些可怕的事情。

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

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