На данный момент я знаю четыре вида транзакций с использованием гибернации:
- Использование объектов
- Использование HQL
- Использование специфичного для БД 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.
ОБНОВЛЕНИЕ: мне это тоже кажется ошибкой, и действительно может быть не связано с введенным SQL. Попытка установки идентификатора с несуществующим значением, а также возвращает все строки. Попытка внедрения с 5 '=' 5 'вместо' 1 '=' 1 'и 5 не распространяется на вызов SQL. Он продолжает использовать (1 = 1) в качестве предложения where.
ОБНОВЛЕНИЕ 2: решено. Смотрите ответ ниже.