Предотвращение SQL-инъекций с помощью спящего режима

У меня есть существующий код, где приложение генерирует различные sql в зависимости от множества условий и выполняет их через сеансы гибернации createSQLQuery (). Здесь параметры согласуются со строкой sql, которая находится в классе java как обычная замена строки. Проблема здесь в том, что теперь мне нужно предотвратить инъекции sql. Поэтому для этого мне нужно использовать getNamedQuery () и связать параметры, чтобы hibernate позаботился о специальных символах. Но проблема заключается в перемещении строки sql 'Файл s to xml - это накладные расходы, потому что условно генерируется sql 's. Поэтому я решил вручную выполнить проверку специального символа и добавить его к строковому запросу и выполнить, как сейчас. Итак, я проверяю источник для PrepareStatement, который я нашел, он просто выдает исключение

byte[] arrayOfByte1 = new byte[0];
try
{
   arrayOfByte1 = CharsToBytes(this.OdbcApi.charSet, arrayOfChar);
}
   catch (UnsupportedEncodingException localUnsupportedEncodingException) {
}

Как я могу сделать тот же вид кодирования в классе Java, как указано выше для параметров, прежде чем объединить их со строковым запросом для устранения SQL-инъекций? Или есть ли способ сохранить строку sql, так как это параметры добавления и использовать hibernate для выполнения запроса?

Ответы на вопрос(2)

Решение Вопроса

Насколько я могу судить, вы хотите создавать SQL-запросы на лету, потому что комбинация условий (из пользовательского интерфейса, я думаю) может быть очень сложной. Тот'хорошо. Все, что вам нужно для контроля - это параметры, которые предоставляет пользователь. И для этого вы можете и должны использовать Hibernate'screateSqlQuery(), Эта функция понимает либо? для позиционных параметров (пронумерованных от начала строки запроса), или:param_name синтаксис, а затем вы предоставляете именованные параметры. Ты неНе нужно ничего перемещать в XML-файл.

Раздел 16.1.7 есть примеры.

 Harshana30 мая 2013 г., 06:20
Спасибо, Андрей. Это мне очень помогает. Здесь я использую createSQLQuery и параметры привязки с помощью метода setString (). Я видел в другом месте, что он использует getNamedQuery () и добавляет параметры, используя метод setParameterList (). Я надеюсь, что и в обоих случаях, hibernate позаботится о инъекциях sql, верно?
 Andrew Lazarus30 мая 2013 г., 09:16
Короткий ответ:Да. На самом деле работа не выполняется Hibernate, а потому, что Hibernate сам вызывает драйвер JDBC для вашей базы данных (информация для этого, вероятно, содержится в файле persistence.xml, хотя в вашей IDE могут быть другие способы сделать это). Эти драйверы уделяют большое внимание предотвращению внедрения SQL; Я уверен, что PreparedStatement безопасен. В любом случае, авторы драйверов потратили на это гораздо больше времени и усилий, чем вы можете сэкономить в рамках более крупного проекта. Изобретать колесо - это нормально, как упражнение по кодированию, но обычно плохо в производстве.

Если вам нужно собрать пользовательский SQL в запрос, яЯ нашел, что написание моих собственных классов критериев, включающих пользовательский SQL, работает хорошо.

Вам просто нужно реализовать интерфейс Criterion.https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/criterion/Criterion.html

(См. Также реализацию Hibernate 'ненулевой':http://www.grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.4.sp1/org/hibernate/criterion/NotNullExpression.java?av=f .)

Затем вы можете просто создать каждый пользовательский запрос, используя обычный API критериев гибернации.

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-creating

Корректная очистка значений SQL - это больно - старайтесь изо всех сил избегать этого! ;-)

Ваш ответ на вопрос