Как SQL-инъекция обычно останавливается в настройках Spring / Hibernate - PullRequest
17 голосов
/ 27 января 2011

Я ненавижу язык Ruby, потому что он не статически типизирован, но чем больше времени я провожу с Spring / Hibernate, я ценю больше возможностей Ruby on Rails. В частности, тот факт, что их модель Active Record предотвращает внедрение SQL для вас. Как эта проблема обычно решается с помощью стека Spring / Hibernate? Приходит ли какой-либо из них с каким-либо набором инструментов для очистки, чтобы убедиться, что ваш пользовательский ввод безопасен?

Это не большая проблема для вставки, если вы просто вставляете DAO, но это серьезная проблема при использовании операторов Select.

Ответы [ 2 ]

34 голосов
/ 27 января 2011

Внедрение SQL не должно быть риском при использовании Hibernate - при условии, что вы используете его правильно.

Запросы Hibernate либо пишутся на HQL (SQL-подобный язык запросов Hibernate), либо реализуются с использованием объектно-ориентированного API Criteria.

HQL является наиболее распространенным и наиболее рекомендуемым. Обычно вы пишете запрос HQL следующим образом:

    Subscription sub = (Subscription) sessionFactory.getCurrentSession()
        .createQuery("from Subscription sub where sub.verification = :verification")
        .setString("verification", verification)
        .uniqueResult();

В этой форме вы защищены от внедрения SQL, потому что Hibernate передает строку как параметр; его нельзя интерпретировать как часть SQL.

Однако, если вы ведете себя плохо, напишите запрос, подобный этому ...

    Subscription sub = (Subscription) sessionFactory.getCurrentSession()
        .createQuery("from Subscription sub where sub.verification = '" + verification + "'")
        .uniqueResult();

... тогда вы не защищены от внедрения SQL. Однако вы никогда не должны писать подобные запросы! Я не думаю, что какая-либо структура защитит вас, если вы добавите строки в свои запросы.

Наконец, если вы используете Hibernate Criteria API, вы автоматически защищены от внедрения SQL; поскольку Hibernate создает базовый запрос при использовании API Criteria, он делает это таким образом, чтобы предотвратить внедрение SQL.

1 голос
/ 27 января 2011

Я думаю, что вы ответили на свой вопрос - если вы используете только HQL в качестве крайней меры, то это, вероятно, сокращает 95% потенциальных точек атаки.И поскольку вы используете его только в тех сложных случаях, вы, вероятно, будете уделять больше внимания тому, что вы на самом деле делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...