如何解决报表的 SQL 植入风险
SQL 注入或者 SQL 植入是 WEB 应用程序与数据库交互过程中,由于对用户输入数据的合法性、规范性检测做的不严而导致的一种常见的漏洞,这种漏洞如果被攻击者加以利用,在查询语句的结尾添加非法的 SQL 语句,就能进行非法的查询,会导致数据泄露,风险很大
报表应用作为一个 WEB 应用,同样会面临这样的风险
为了解决普通参数查询不灵活,不自由的问题,很多报表工具开放了动态拼 SQL 的功能,允许 SQL 中进行子句替换,类似这样:
SELECT … FROM T WHERE ${w}
w 就是可以根据用户需求随意拼的,比如 data>… AND date<=… AND area=…
这样查询就灵活多了,但是风险也就来了,这个 w 就会有 SQL 注入的隐患,比如:
SELECT … FROM T WHERE 1=0 UNION SELECT … FROM user
这是一句可执行的合法 SQL,但 user 表中的信息就被泄露了
怎么样解决这个问题呢?
1 尽量使用普通的 SQL 参数,不要动态拼 SQL
这样做,虽然灵活度差一点,但安全
有些报表工具不支持普通 SQL 参数,只提供拼 SQL 的方案,方便是方便了,但就要小心了
2 需要通用查询时,写复杂一点的 SQL
比如:
SELECT … FROM T WHERE (${w})
SELECT … FROM T WHERE (${w}) OR ${w}
这样做有一定的效果,但是并不完美,有些时候也防不住,而且 SQL 复杂后,会影响执行效率
3 再检查关键字
通常通用查询的条件不会有这些 select,from 等关键字,所以可以通过过滤这些关键字来防范风险,不让参数中有这些关键字的 SQL 执行,虽然这样做有时候会失去一些灵活性,但是安全性却更高了
润乾报表把这些都做好了,直接用就可以了
我们就以润乾报表为例,来简单看一下实现步骤
1 在 XML 文件中配置关键字过滤
部署润乾报表后,在应用目录下找到 **raqsoftConfig.xml ** 文件,配置敏感词列表
属性名:disallowedParamWordList,value 为禁用敏感词列表,多个之间用逗号分隔,英文字母不区分大小写
配置列表以后,如果访问的 URL 中再出现敏感词,就会提示出错了,减少风险的发生
http://localhost:6868/demo/reportJsp/showReport.jsp?rpx=a.rpx&arg2= 华北 union select * from users
2 已经做完了
是的就这么简单,在一个已经提供了防止 SQL 注入的工具中,就是这么轻松一步设置就可以规避风险了,所以选型的时候,多问问,看看各厂商是否能解决这问题,怎么解决的,否则就得自己去费劲去修补这个漏洞了
更详细的操作以及其他解决方式请参考: 报表的 SQL 植入风险及规避方法