Как защитить запрос Hibernate QBE

К настоящему моменту я знаю четыре вида операций с спящим режимом:

  • Использование объектов
  • Использование HQL
  • Использование DB-специфического SQL
  • Использование критериев (QBE)

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

  • Безопасно, поскольку внутренний SQL-запрос параметризуется.
  • Безопасно, если запрос параметризован, в противном случае это небезопасно.
  • То же, что и # 2, но не как переносное.
  • небезопасный?

Мой вопрос о # 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.

UPDATE: Мне тоже кажется ошибкой, и действительно может быть не связано с введенным SQL. Пробовал устанавливать id с несуществующим значением и также возвращать все строки. Пробовал инъекцию с помощью "5" = "5" вместо "1" = "1", а 5 не распространялся на вызов SQL. Он продолжает использовать (1 = 1) как предложение where.

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

Ответ 1

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

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

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

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

Ответ 2

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