Java Hibernate与安全威胁
在我的java程序中,我使用Hybernate技术访问名为items的MySQL数据库表。该表有名为itemname itemprice itemid的列&我的java程序有HQL语句来获取数据。它还有一个从items表填充的组合框。一旦我们从组合框中选择一个itemname,它会自动填充两个不可编辑的jtext字段itemid&itemprice,程序的另一部分有代码从这些jtextfields中获取字符串值,并使用POJO类将这些值写入另一个名为orders的数据库表中 我想知道,这种程序可能会受到sql注入的攻击,如果我们使用Hibernate,它就不会受到sql注入攻击???。。。。 如果我的程序存在安全威胁,请简要说明如何避免这些威胁 我在这里贴了一些代码。 此语句用于填充组合框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的数据库表中 我想知道,这种程序可
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表单,这是一个简单的桌面应用程序。