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)
如果我把它贴在这里,很难理解我的整个代码。所以我发布了一些我认为有助于回答我的问题的代码。如果这还不够,请发表评论。
谢谢!
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 可以被缓存并用于参数的不同值。因此,即使没有安全问题,这也是一个好主意。