Предотвращение SQL-инъекций в Hibernate - PullRequest
10 голосов
/ 05 января 2011

Я использовал hibernate для взаимодействия с моей базой данных, теперь я хотел сделать свой уровень базы данных защищенным от SQL-инъекций, поэтому я провел некоторое исследование и обнаружил, что мои запросы должны быть параметризованы, так значит ли это, если я просто структурирую мои запросы HQL как:

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

Тогда он параметризован и защищен от SQL-инъекций, или есть что-то еще, что мне нужно сделать ...

Было упомянуто еще одно: " Всегда избегайте ваших данных " Как этого достичь ??

1 Ответ

4 голосов
/ 05 января 2011

Я не знаю о setString(), но если оно совпадает с setParameter(), тогда да, этого достаточно, чтобы предотвратить инъекцию sql.

Обновление

Экранирование данных означает, что вы должны убедиться, что вы не храните опасные значения в базе данных.

Быстрый пример, например, если вы передаете аргумент

String name = "<script>alert('Hello');</script>";
//insert this name into Mother, and then when you load it from the database, it will be displayed    

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

к вашему запросу, затем в следующий раз, когда вы загрузите его из базы данных и отобразите его в веб-браузере, он запустит скрипт.Вы должны убедиться, что ваш фреймворк экранирует все недопустимые символы, например: измените < на &lt; перед тем, как вставить его в базу данных.Если ваш фреймворк не делает этого, вы должны сделать это вручную.Есть множество библиотек, которые правильно экранируют код для вас.Взгляните, например, на этот вопрос и ответы на него.

...