gpt4 book ai didi

java - SQL 注入(inject)通常如何在 Spring/Hibernate 设置中停止

转载 作者:太空狗 更新时间:2023-10-29 22:38:02 29 4
gpt4 key购买 nike

我讨厌 Ruby 语言,因为它不是静态类型的,但我花在 Spring/Hibernate 上的时间越多,我就越欣赏 Ruby on Rails 的特性。特别是他们的 Active Record 模型可以为您防止 SQL 注入(inject)。 Spring/Hibernate 堆栈通常如何处理这个问题?其中任何一个都带有某种清理工具包,以确保您的用户输入是安全的吗?

如果您只是插入 DAO,这对插入来说不是什么大问题,但在使用 Select 语句时这是一个主要问题。

最佳答案

当您使用 Hibernate 时,SQL 注入(inject)应该不会有风险 - 只要您正确使用它。

Hibernate 查询要么用 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 注入(inject),因为 Hibernate 将字符串作为参数传入;它不能被解释为 SQL 的一部分。

但是,如果您表现不佳,请编写这样的查询...

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

...那么您将无法免受 SQL 注入(inject)攻击。但是你永远不应该写这样的查询!如果您将字符串附加到查询中,我认为任何框架都不会保护您。

最后,如果您使用 Hibernate Criteria API,您将自动受到 SQL 注入(inject)的保护;因为 Hibernate 会在您使用 Criteria API 时构建基础查询,所以它会以防止 SQL 注入(inject)的方式进行构建。

关于java - SQL 注入(inject)通常如何在 Spring/Hibernate 设置中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4811963/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com