2012-01-30 39 views
16

为了得到一些数据,我创建一个SQL查询:)
当然还有一些过滤和订购零件。防止在Oracle SQL注入“排序依据”部分

为了让我用“是NamedParameterJdbcTemplate”,当我需要的东西添加到“哪里”的一部分,我用的参数映射,以防止注射的结果。

但“按订单”的部分是不同的,因为没有自动转义(和它的SQL的一部分)。该订单部分有时会填充来自用户的数据(直接),有时会从内部代码中添加一些额外的排序参数。有一个问题:有时这种排序字段不仅包含列名,而且还包含sql语句

现在对于排序每个参数被替换一些字符(如“),以空字符串手动逃过一劫,但我们对我们的代码设置一些参数是有点复杂,通过这一规则。

当您使用jdbc模板时,在查询的排序部分防止sql注入的最佳方法是什么?

+9

+1关怀:) – RedFilter 2012-01-30 13:23:15

+1

可能使用'PreparedStatement'? – Romain 2012-01-30 13:25:30

+0

我不知道jdbc,但可以在Oracle中的'order by'中使用绑定变量。 – Ben 2012-01-30 13:33:11

回答

7

为了帮助防止在数据库端SQL注入后卫,看看内置的Oracle包DBMS_ASSERThttp://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm

您可能会发现SIMPLE_SQL_NAME功能将有助于防止SQL注入你的ORDER BY条款。

希望它有帮助...

+0

这可能会更好,然后使用自定义转义函数。如果没有办法做到这一点与一些库(jdbctemplate或类似的东西),可能会做到这一点。 – Dainius 2012-01-30 17:10:36

1

一种方法我用了,虽然略有不同的原因是使用 顺序按3,2(第三列,第二列)

所以,如果你可以计算出用户位置的列中输入列名输出,间接应该杀死注入向量。

+0

问题有时这种排序字段不仅包含列名,而且还包含一条sql语句 – Dainius 2012-01-30 13:37:01

+0

用户输入了sql语句? – 2012-01-30 15:42:41

+0

不是直接的,一些链接有传递给“order by”部分的参数。首先要解决的问题是创建允许排序字段的映射,并通过url参数获取该字段,作为一个关键字,类似于(或相同的)文森特的建议。但也有一些旧代码,我不想修改(谁知道它会生存多久),并且有一些sql。并且可能会有其他地方使用此订单参数。 – Dainius 2012-01-31 07:50:28

2

您可以限制排序顺序的选择。大多数应用程序只允许用户按显示列进行排序,用户可以选择要在列位置排序的列。

在这种情况下,你将只接受来自用户的整数(你能接受一个负数的降序排序)。您可以通过接受整数列表让用户按几列排序。

整数很容易检查,这不会将底层列名暴露给用户。