对于我的客户,我正在构建自定义报告生成器,以便他们可以创建自己的报告。
概念是这样的:在控制表中,它们填写报告列的内容。每列可以包含来自不同数据源(=表格)或公式的数据。
以下是一个缩小的示例:
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注入的参数。
否则我认为我需要限制普通用户的系统灵活性,只有“超级用户”才能访问完整灵活的报告。
答案 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 ...,以加强您的代码/查询。