Как защитить запрос 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.