Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate与安全威胁_Java_Mysql_Hibernate_Sql Injection - Fatal编程技术网

Java Hibernate与安全威胁

Java Hibernate与安全威胁,java,mysql,hibernate,sql-injection,Java,Mysql,Hibernate,Sql Injection,在我的java程序中,我使用Hybernate技术访问名为items的MySQL数据库表。该表有名为itemname itemprice itemid的列&我的java程序有HQL语句来获取数据。它还有一个从items表填充的组合框。一旦我们从组合框中选择一个itemname,它会自动填充两个不可编辑的jtext字段itemid&itemprice,程序的另一部分有代码从这些jtextfields中获取字符串值,并使用POJO类将这些值写入另一个名为orders的数据库表中 我想知道,这种程序可

在我的java程序中,我使用Hybernate技术访问名为items的MySQL数据库表。该表有名为itemname itemprice itemid的列&我的java程序有HQL语句来获取数据。它还有一个从items表填充的组合框。一旦我们从组合框中选择一个itemname,它会自动填充两个不可编辑的jtext字段itemid&itemprice,程序的另一部分有代码从这些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+"'";
此方法在orders表中写入数据

 //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 !!!");
}
}
如果我把它贴在这里,很难理解我的全部代码。因此,我发布了一些代码,我认为这些代码有助于回答我的问题。如果这还不够,请评论


谢谢

如果通过将字段值与HQL文本的其余部分连接起来来创建HQL,则会出现问题。如果对所有字段值正确使用HQL和替换变量,则可以。显然,关于这一点,我们还有更多的话要说,但如果没有OP的更多细节,我们现在只能说这些了。另外,如果插入/更新逻辑纯粹是使用POJO,那么就可以了

更新:


现在你已经发布了一些代码,是的,你有问题。您应该在HQL中使用命名参数。不过,您的编写代码很好。

如果您是通过将字段值与HQL文本的其余部分连接在一起来创建HQL,则会出现问题。如果对所有字段值正确使用HQL和替换变量,则可以。显然,关于这一点,我们还有更多的话要说,但如果没有OP的更多细节,我们现在只能说这些了。另外,如果插入/更新逻辑纯粹是使用POJO,那么就可以了

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

现在你已经发布了一些代码,是的,你有问题。您应该在HQL中使用命名参数。不过,您编写的代码很好

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'";
如果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();
应该与您希望编码和执行查询的方式大致相同

类似的事情也适用于HQL

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

如果这不是一个web表单,而是一个桌面应用程序,那么您可以完全控制可以进入该变量的值,但是仍然建议您尝试正确地执行这些操作

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

如果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();
应该与您希望编码和执行查询的方式大致相同

类似的事情也适用于HQL

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

如果这不是一个web表单,而是一个桌面应用程序,那么您可以完全控制可以进入该变量的值,但是仍然建议您尝试正确地执行这些操作


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

给我们看一些代码,也许我们可以显示哪些部分容易受到sql注入的影响。给我们看一些代码,也许我们可以显示哪些部分容易受到sql注入的影响。这可能是一种威胁,具体取决于表单的编码方式。如果这是一个web表单,滥用者可能能够提供该值,可能是通过javascript调用绕过正常表单提交过程。我如何防止这种情况发生??&这不是一个web表单这是一个简单的桌面应用程序。它可能是一个威胁,具体取决于表单的编码方式。
如果这是一个web表单,滥用者可能能够提供该值,可能是通过javascript调用绕过正常表单提交过程。我如何防止这种情况发生??&这不是一个web表单,这是一个简单的桌面应用程序。