SQL注入通常如何在弹簧/休眠设置中停止

2022-09-02 20:19:15

我讨厌Ruby语言,因为它不是静态类型的,但是我花在Spring/Hibernate上的时间越多,我就越喜欢Ruby on Rails的功能。具体来说,他们的活动记录模型会阻止您进行SQL注入。使用 Spring/Hibernate 堆栈通常如何处理此问题?任何一个是否都带有某种清理工具包,以确保您的用户输入是安全的?

如果您只是插入 DAO,这在插入上并不是一个大问题,但在使用 Select 语句时,这是一个主要问题。


答案 1

当您使用Hibernate时,SQL注入不应该是一个风险 - 只要您正确使用它。

休眠查询要么用 HQL(Hibernate 的类似 SQL 的查询语言)编写,要么使用面向对象的 Criteria 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,则会自动保护您免受SQL注入;由于 Hibernate 会在您使用条件 API 时生成基础查询,因此它以阻止 SQL 注入的方式进行构建。


答案 2

我想你已经回答了自己的问题 - 如果你只是使用HQL作为最后的手段,那么这可能会减少95%的潜在攻击点。而且,因为你只在那些棘手的边缘情况下使用它,你可能会更关注你实际在做什么。


推荐