Спящий режим и угрозы безопасности - PullRequest
1 голос
/ 07 марта 2012

В моей java-программе я использовал технологию Hybernate для доступа к таблице базы данных MySQL, называемой items. В этой таблице есть столбцы с именем «itemname itemprice itemid», а в моей java-программе есть операторы HQL для извлечения данных.Также он имеет поле со списком, который заполняется из таблицы предметов.Как только мы выбираем имя элемента из поля со списком, оно автоматически заполняет два нередактируемых поля jtext, называемых itemid & itemprice, и другая часть программы имеет коды для получения строковых значений из этих jtextfields и записи этих значений в другую таблицу базы данных, называемую orders, с использованием класса POJO..

Я хочу знать, что программа такого типа может быть атакована 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 !!!");
}
}

Трудно понять весь мой код, если я отправлю сообщениеэто здесь.Поэтому я опубликовал несколько кодов, которые я считаю полезными для ответа на мой вопрос.Если этого недостаточно, пожалуйста, прокомментируйте.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 07 марта 2012
String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'";

подвержен sql-инъекции, если selectedItem - данные, введенные пользователем.

Генерация 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.

Если вы просто объединяете строки, злые значения, введенные хакером, как в знаменитом xkcd , становятся частью вашего запроса и могут делать ужасные вещи.

Если это не веб-форма, а настольное приложение, вполне возможно, что вы полностью контролируете значения, которые могут попасть в эту переменную, но все же рекомендуется попытаться сделать это правильно.

Другим эффектом именованных параметров является то, что параметризованный sql может быть кэширован и повторно использован для различных значений параметра. Так что это хорошая идея даже без заботы о безопасности.

3 голосов
/ 07 марта 2012

если вы создаете HQL путем объединения значений полей с остальным текстом HQL, у вас есть проблема.если вы используете HQL (правильно) с переменными подстановки для всех значений полей, у вас все в порядке.(очевидно, можно было бы сказать об этом больше, но без подробностей из ОП, это все, что мы можем сказать в настоящее время).Кроме того, если вы вставляете / обновляете логику исключительно с помощью POJO, то все в порядке.

ОБНОВЛЕНИЕ:

теперь, когда вы отправили код, да, у вас есть проблемы.Вы должны использовать именованные параметры в вашем HQL.(хотя ваш код записи в порядке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...