К настоящему моменту я знаю четыре вида операций с спящим режимом:
- Использование объектов
- Использование 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: Решено. См. Ответ ниже.