Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

SQL-инъекция не должна представлять опасность при использовании Hibernate - если вы используете ее правильно.

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

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-инъекции. Однако вы никогда не должны писать такие запросы! Я не думаю, что какая-либо инфраструктура защитит вас, если вы добавите строки к своим запросам.

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

Ответ 2

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