使用自定义公式

时间:2015-05-15 10:07:07

标签: sql-server sql-injection sql-server-2014

对于我的客户,我正在构建自定义报告生成器,以便他们可以创建自己的报告。

概念是这样的:在控制表中,它们填写报告列的内容。每列可以包含来自不同数据源(=表格)或公式的数据。

以下是一个缩小的示例:

Column | Source  | Year   | Account | Formula
----------------------------------------------
col1   | TAB1    | 2015   | SALES   | (null)
col2   | TAB2    | 2014   | SALES   | (null)
col3   | FORMULA | (null) | (null)  | ([col2]-[col1])

因此col1和col2从表tab1和tab2获取数据,col3计算差异。

然后,存储过程会创建动态SQL,并传递报告数据。 生成的SQL查询如下所示:

SELECT 
    (SELECT sum(val) from tab1 where Year=2015 and Account='SALES') as col1,
    (SELECT sum(val) from tab2 where Year=2014 and Account='SALES') as col2,
    (
       (SELECT sum(val) from tab1 where Year=2015 and Account='SALES')
       - 
       (SELECT sum(val) from tab2 where Year=2014 and Account='SALES')
    ) as col3 ;

实际上它要复杂得多,因为有更多参数,我正在使用coalesce()等。

我主要的头痛是配方。虽然它们为用户提供了非常灵活的工具,但它完全容易受到SQL注入的攻击。<​​/ p>

只是想知道是否有一些简单的方法来检查可能的SQL注入的参数。

否则我认为我需要限制普通用户的系统灵活性,只有“超级用户”才能访问完整灵活的报告。

1 个答案:

答案 0 :(得分:1)

不是真的 - 许多注射涉及评论(评论其余的正则性声明),因此您可以检查评论( - 和/ *)和;标志(结束)。

另一方面,如果您允许用户将任何内容放入过滤器中 - 为什么不应该将过滤器编写为1 = (select password from users where username = 'admin')以引发错误消息Error converting 'ReallyStrongPassword' to integer'

此外,如果我看到你的查询,我认为性能将会是一个更大的问题(如果你要编写它,它将会读取tab1和tab2两次,而不是只读一次&#39;常规&#39;)。

编辑: 您可以在filter参数中检查SQL代码字作为select,update,delete,exec ...,以加强您的代码/查询。