【问题标题】:Spring JPA @Query and @Param string escaping (sql injection)Spring JPA @Query 和 @Param 字符串转义(sql 注入)
【发布时间】:2021-04-10 01:05:27
【问题描述】:

下午好

我相信 org.springframework.data.jpa.repository.Queryorg.springframework.data.repository.query.Param 结合使用可以防止 SQL 注入超过这些参数。
例如:

@Query("DELETE User c WHERE c.issuer = :issuer AND c.subject = :subject")
    void deleteByIssSub(@Param("issuer") String issuer, @Param("subject") String subject);

应该是安全的。如果我错了,请纠正我。

现在我正在寻找文档,该文档描述了 @Param 与 @Query 结合使用可防止 SQL 注入(抛出字符串转义)。 但是我没有找到这个文档。

我错了吗?

T

【问题讨论】:

    标签: java spring jpa


    【解决方案1】:

    这有帮助吗? How to prevent SQL Injection with JPA and Hibernate?

    默认

    当您使用参数时 (=:)

    设置参数时 ( .setParameter("issuer", issuer) )

    在您的代码中将 SQL 注入的更改减少到 0,因为您正在通过代码构建查询,您不允许用户以更改的形式向数据库发送任何查询,他唯一可以发送的就是参数,并且只有预期的参数。

    https://mkyong.com/hibernate/hibernate-parameter-binding-examples/

    只要避免使用字符串连接构建动态查询,您就会安全,但如果您确实需要使用动态查询,则需要改用 Criteria API。

    编辑: 没有人可以为您保证,因为我引用了 OWASP 页面: “Hibernate 不授予对 SQL 注入的免疫力,人们可以随意滥用 API。” 所以没有人会说它是 100% 防弹的,因为人们可以编码和使用 API,因为它不应该被使用或设计。 https://owasp.org/www-community/Hibernate#Security_Implications

    OWASP 是谁? OWASP® 基金会致力于通过其社区主导的开源软件项目、全球数百个分会、数万名成员以及举办本地和全球会议来提高软件的安全性。

    无论一辆车有多安全,制造商都不会说“我们的车是不会撞的”,他们只会说它真的很安全。安全性也是如此。涉及人为因素的任何事情都不是 100% 安全的。

    【讨论】:

    • 谢谢,但这不是我要找的。我正在寻找文档或 API,我可以在其中看到 @Query 和 @Param 可以安全使用。类似证明的东西。不仅仅是论坛中的答案或对类似 setParameter 方法的引用......我发现文档说,setParameter 已保存:baeldung.com/sql-injection#1parameterized-queries
    • 我将更新我的答案,只是为了向您提供更多信息,说明为什么您无法在文档中找到任何证据。此外,Baeldung 不是文档,它是一个获得版主绿灯的程序员发布示例以换取现金的网站。
    • 好的,谢谢。我明白你的意思。我在想这样的事情一定是缺少信息的原因。我不需要保证一切都是安全的,但是当我找到一个点时,我会有一种很好的感觉,有人写道他们知道 SQL 注入的问题,并且他们建立了一些机制来防止它。否则我会认为作者不关心 SQL 注入并将该责任转嫁给使用该库的程序员。
    猜你喜欢
    • 2018-08-31
    • 2015-03-06
    • 2020-09-23
    • 2013-07-04
    • 2010-12-21
    • 2011-09-26
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多