【问题标题】:Does Hibernate's Query.setParameter make SQL injection possible [duplicate]Hibernate 的 Query.setParameter 是否使 SQL 注入成为可能 [重复]
【发布时间】:2017-09-12 18:33:06
【问题描述】:

我正在使用 Struts2 框架和 Hibernate,我正在增强一个我没有启动的系统,我增强了系统的一些功能并在产品。但是当他们使用Acunetix 扫描它时,在登录模块的某处,系统中检测到了一些威胁(警报),其中警报显示:

警报:SQL注入

严重性:高

说明:此脚本可能容易受到 SQL 注入攻击。

建议:您的脚本应该从用户输入中过滤元字符。查看详细信息以获取有关修复的更多信息 这个漏洞。

然后,我检查了该警报的错误脚本。老开发者使用 Hibernate 创建查询。

List<UserBean> users = session.createQuery("from UserBean where username =?")
    .setParameter(0,username)
    .list();

我的问题是:

-这个使用Hibernate的查询不能避免SQL注入吗?

-为了避免 SQL 注入,.setParameter 是否应该是 .setString 更具体?

或以上都不是?

感谢您的时间。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果您像这样使用 Hibernate 查询参数绑定,您可以免受 SQL 注入攻击。

    与字符串连接相反,setParameter 将在创建准备好的语句之后和执行查询之前填充查询的占位符,并且查询处理引擎知道应该转义哪些(可能是恶意的)字符。

    这是常见的方法。

    setStringsetParameter 的非通用挂件。 setParameter 自动检测数据类型。

    一个小的改进是使用命名参数绑定,例如:

    List<UserBean> users = session.createQuery("from UserBean where username = :username")
    .setParameter("username", username)
    .list();
    

    这样你以后不会遇到更多参数的问题。

    【讨论】:

    • 这对我来说解释了很多,但是为什么即使我通过名称绑定它,它也提醒它容易在 SQL 注入中发生。?
    • 我根本不知道 Acunetix 工具,您必须向该主题的专家询问报告为什么会这样说。也许这只是因为该工具没有找到任何验证您的输入的代码,并且它不知道 Hibernate 或准备好的语句是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2013-02-10
    • 2013-02-25
    • 2011-03-27
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多