Я код, который переводит пользователя поисковое слово в запросе MySQL:Hibernate createSQLQuery - Как это проверить SQL?
String sql = String.format("SELECT * FROM my_table WHERE my_column = '%s'", value);
HibernateUtil.getCurrentSession().createSQLQuery(sql);
Чтобы проверить, если я был защищен, и потому что я думаю, что было бы интересно узнать, таким образом, я хотел, чтобы попытаться SQL вводит мое собственное приложение. Так что я искал:
x'; DROP TABLE test;--
, что приводит к следующему запросу:
SELECT * FROM my_table WHERE my_column = 'x'; DROP TABLE test;--
Но Hibernate бросает SQLGrammarException. Когда я запускаю этот код через phpMyAdmin, он правильно выводит тестовую таблицу.
Как Hibernate проверяет мой SQL? Возможно, что более важно - защищает ли я меня от SQL-инъекции или я должен использовать setParameter. Если это не защитит меня, могу ли я привести пример SQL, который будет выполнять инъекцию. Я думаю, было бы действительно интересно проверить.
Рекомендуется использовать параметризованные запросы. – doublesharp
@ doublesharp, справа, но прежде чем я изменил весь код доступа к данным, мне захотелось проверить, что 'createSQLQuery' does * not * дезинформирует мой SQL. – gwg
Что такое сообщение 'SQLGrammarException'? –