动态SQL及安全性(Birt vs润乾)

  

  静态SQL与动态SQL   

  

  对于题目中提到的动态SQL,显然应该有一种静态SQL与之相,对那么两者应该怎么理解?我们先来个基本的认识。   

  

  静态SQL之“静”态,意味着在执行之前就已经明确了该SQL在数据库执行后的业务含义,也就是对于做啥事儿我们是清楚的,只不过需要知道这事儿的具体内容有哪些。比如“选择userID,来自用户的用户名,deptName=的销售部”“,意思就是查销售部的所有用户ID及用户名。再稍微灵活一点,可以写作“选择userID,来自用户的用户名deptName=在哪里?”,此时语句中的”?“传递哪个部门名称,相对应的就查哪个部门的用户信息,但sql本身所要做的“查询某部门下的用户信息”这个事情我们是完全明确的,不确定的只是用户有多少,各自的信息是什么。   

  

  而动态SQL之所以称为“动态”,就是在是否”明确业务含义”这一点上是“不明确”的,也就是说SQL应该执行出啥结果,我们本身并没有明确的预期,包括查什么,用哪些条件以及怎么组合这些条件等,原则上,这些都可以随意选择组合。   

  

  比如:“选择userID,来自用户的用户名在${条件}",此处的条件可以随意指定合理的查询条件,当传入“deptName=皒x部门’”时,执行结果是查询某部门的用户信息;当传入“roleName=凹际踔鞴艿摹笔?则是按照角色筛选复合条件的用户信息。尽管都是返回用户信息,但不同条件下,我们可以认为是两个不同的业务,这里的sql我们就称之为是动态的,显然,这样的sql执行后得到的结果的业务含义也是完全不确定的。   

  

  上面动态sql的例子是条件不固定,实际上动态sql还允许返回字段不确定,如“从用户选择userID, ${字段}…”,需要查询哪些字段,完全由动态指定的“字段”来确定,可以查deptName,也可以查用户名和deptName,非常自由,灵活。   

  

  同理,使用的物理表也可能不固定,例如定义为“从${表}选择……”时,“表”给定啥值就从哪个表查数据。   

  

     

  

     ,         :功能固定,比较传统,但相对比较安全。      

  

     ,         :自由灵活,但同时不得不提到         植入风险,一旦被攻击者利用可能的         漏洞,会有相当严重的安全问题,如窃取用户信息,篡改数据等等。      

  

        的功力,因此难以对         的安全性问题考虑周全,动态         可能带来的风险也就很难排除。而要规避动态         风险,无非是下面两种方法:      

  

     ,         配合工作,尽可能协助提供安全性高的         ;      

  

     ,         注入风险的方法。      

  

        需要依赖外部         的配合,不是总能满足,所以,比较可行的,还是在考察报表产品时,考虑报表工具是否提供防         植入风险的功能支持。不然,在安全第一的前提下,就只能不用动态         ,退而选择静态         了,毕竟安全还是最重要的,一旦造成信息泄露,责任很难承担。      

  

        和润乾报表,看看它们各自在动态         以及安全性方面的表现如何:      

  

              sql      实现   

  

        sql * * * *的做法有两种:      

  

     ,         拼接* * * *的sql      

  

     ,         开发能力,咱们就不介绍了,感兴趣的可以到网上搜索自行研究。      

  

        脚本拼接         的方式。      

  

        实现由终端用户选择应该查询”工资”列还是“应发工资”列      

  

  动态SQL及安全性(Birt vs润乾)   

  

  1,新建报表并新增数据源(hsql)   

  

  动态SQL及安全性(Birt vs润乾)   

  

     ,      

动态SQL及安全性(Birt vs润乾)