【问题标题】:How to prevent SQL second order injections in java (Spring Application)java中如何防止SQL二阶注入(Spring Application)
【发布时间】:2016-08-31 03:04:36
【问题描述】:

我在下面这段代码中一直面临着二阶SQL注入

if(subjectId!=null){Query query= sessionFactory
            .getCurrentSession()
            .createSQLQuery(HubQueryConstants.GET_QUERY)
            .setParameter(MyConstants.SUBJECT_ID, subjectId)
            .setFirstResult(offset)
            .setMaxResults(limit)
            .setResultTransformer(
                    Transformers.aliasToBean(MyClass.class));}

我的常量文件是:

常量文件是最终类

GET_QUERY="Select * from MyClass where id=:id ";

虽然默认情况下它处于静态查询中,但我的安全报告仍将其作为二阶 SQL 注入

我们应该在接口中声明常量吗?避免安全问题?

【问题讨论】:

  • 我会说你的安全报告是错误的。
  • 我认为您可以在查询的 id 参数中注入 sql。但是当您使用休眠时(我猜)您的查询被转换为preparedStement。所以你应该得救了。
  • 我在上面的 sn-p 中使用 Sql 查询,虽然我使用的是 HQL 查询,但我的报告显示了二阶 SQL 注入

标签: java spring security constants sql-injection


【解决方案1】:

当占位符被替换为更改原始 SQL 字符串的 SQL 术语时,就会发生 SQL 注入,从而使 SQL 执行与预期不同的操作。

您可以在SQL_injection找到更多详细信息

当参数的占位符被替换时会发生 SQL 注入。因此,声明常量而不是从属性文件中读取 SQL 并没有帮助。注入稍后发生,与获取 SQL 字符串的位置无关。

防止 SQL 注入的最简单方法是使用预准备语句。

在执行准备好的语句时,SQL 字符串和参数完全由 SQL 服务器分开处理,使得 SQL 注入不可能。

使用 JPA,您可以使用注解 javax.persistence.NamedNativeQuery; 来声明将作为准备语句执行的 SQL 查询。

jpa-native-queries末尾有一个使用 NamedNativeQuers 的教程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2015-09-07
    • 2011-06-21
    • 2011-10-02
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多