Как обезопасить Hibernate QBE-запрос - PullRequest
3 голосов
/ 19 июля 2011

На данный момент я знаю четыре вида транзакций с использованием гибернации:

  1. Использование объектов
  2. Использование HQL
  3. Использование специфичного для БД SQL
  4. Использование критериев (QBE)

Ну, что касается того, насколько они сильны против инъекций, я думаю, что они (поправьте меня, если я ошибаюсь):

  1. Безопасный, поскольку внутренний вызов SQL параметризован.
  2. Безопасно, если запрос параметризован, иначе небезопасно.
  3. То же, что №2, но не переносной.
  4. небезопасный?

Мой вопрос касается # 4, Query by Example, потому что я обнаружил, что он также уязвим. Пример:

    Account a = new Account(); //POJO class       
    a.setId("1' OR '1'='1");

    //s is a org.hibernate.Session instance
    Criteria crit = s.createCriteria(Account.class);
    crit.add(Example.create(a));
    List results = crit.list();  //table dump!

Этот фрагмент выбирает всю таблицу счетов. Есть ли способ предотвратить инъекцию? Как?

ПРИМЕЧАНИЕ. Я использую Hibernate 3.6.5 final, база данных тестирования - HSQLDB.

ОБНОВЛЕНИЕ: мне это тоже кажется ошибкой, и действительно может быть не связано с введенным SQL. Попытка установки идентификатора с несуществующим значением, а также возвращает все строки. Попытка внедрения с 5 '=' 5 'вместо' 1 '=' 1 'и 5 не распространяется на вызов SQL. Он продолжает использовать (1 = 1) в качестве предложения where.

ОБНОВЛЕНИЕ 2: решено. Смотрите ответ ниже.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Hibernate QBE игнорирует поля id (сопоставленные с PK).Кажется, что это сделано, потому что фильтр id будет возвращать только строку, и это может быть достигнуто с помощью get () или load ().Интересно, что если я захочу использовать аналогичное условие для идентификатора ???

Похожие сообщения на официальном форуме hibernate:

https://forum.hibernate.org/viewtopic.php?t=927063

https://forum.hibernate.org/viewtopic.php?t=938036

0 голосов
/ 19 июля 2011

Вы можете дезинфицировать ваш ввод, например, в своем коде вы должны убедиться, что в поле ID установлено значение Long.

...