在我的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 !!!");
}
}
如果我在这里发布,很难理解我的整个代码。所以我发布了一些我认为有助于回答我的问题的代码。如果这还不够,请评论。
谢谢!
答案 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中使用命名参数。 (但你的写代码很好)。