专栏首页屈定‘s Blog工作 -- Velocity渲染SQL如何避免注入?

工作 -- Velocity渲染SQL如何避免注入?

业务开发中,会出现一些数据服务系统,既然是数据服务,那么快速提供一个业务查询配置,是必须的能力。在这个方案中,我采取了Velocity渲染SQL Template,渲染后的SQL交由JDBC驱动去执行,那么在这个过程中很有可能出现SQL注入,本文将讨论SQL注入的原理以及在Velocity场景下怎么解决这个问题。

什么是SQL注入?

假设后台系统有一条SQL,select * from user where email=${email} and passwd=${pwd},恰巧后台又使用了字符串模板替换,当传入值为`email=101@qq.com,pwd= xxx’ or 1=1#,那么渲染出来的结果为select from user where email=‘101@.com’ and passwd=’xxx’ or 1=1#’,此时该SQL相当于跳过密码校验,这种现象就是SQL注入。 现象有了,那么注入的本质原因是什么呢? 一条SQL语句我们把需要语法解析的称为SQL逻辑部分,外部传入进来的称为参数部分,举个例子,针对select from user where email=${email} and passwd=${pwd},其SQL部分可以为select * from user where email=? and passwd=?,其参数部分为email=101@qq.com, pwd=xxx`,正常情况下,参数部分不参与SQL语句的解析,只是填充值,当出现注入时,参数部分必然会参与SQL语句的解析,简单说就是逻辑部分与参数部分没有很好的隔离,导致了注入的产生。

如何避免注入?

上述内容分析出本质原因是SQL逻辑部分参数部分没有隔离,那么解决方案即隔离,这也是SQL预编译的实现原理。在Java中JDBC提供了PreparedStatement来实现预编译SQL,其由底层数据库提供支持,相当于应用提交给MySQL服务器一个SQL逻辑,MySQL会先编译好该SQL,然后应用再提供参数,MySQL填充这些参数,这样即使参数中存在or 1=1类似的语句,也不会去执行,因此解决了注入的问题,这也是最根本的一种解决方式。

Velocity渲染SQL该怎么避免注入?

Velocity本质上是字符串拼接,给定什么就拼接什么,实际上是逻辑与数据没有分离开来,最后生成的是plain sql,提交给DB执行,因此非常容易发生注入,那么解决思路如下图所示,经过velocity模板渲染后生成两部分的内容,1是预编译SQL,2是对应的参数集合,这样就做到了逻辑与数据的分离,DB层面使用PreparedStatement进行预编译执行,彻底解决SQL注入的风险。

实现逻辑

实现逻辑也不复杂,Velocity在进行变量替换输出时,会调用对应的钩子函数ReferenceInsertionEventHandler修改对应的输出,那么实现策略就相当简单了,只需要如下图所示,在Velocity与输出时间增加该钩子函数,替换输出字符串为占位符,然后将参数放入List集合中存储。

参考

Velocity Developer Guide

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java--序列化知识点

    今天线上遇到了DTO类实现了Serializable接口,但是其并没有显示声明serialVersionUID,这样的话每次打包有改动JDK就会为其重新生成se...

    屈定
  • Alfred插件开发--了解Alfred的数据流动

    最近发现要记住的长命令太多了,因此打算开发一款Alfred插件帮助自己记录. 先展示下成品,大概就是输入关键词->搜索展示->复制到指定位置这一流程,借此开分析...

    屈定
  • Spring -- 常用的文件工具类

    Spring几乎是当前Java后端项目必备框架之一,其内部有着大量的工具类,了解并熟练使用这些工具类能够节省不少的时间,本文对Spring中文件操作相关工具类进...

    屈定
  • SQL注入

    SQL注入自诞生以来以其巨大的杀伤力而闻名于世。典型的SQL输入的例子就是当对SQL进行字符串拼接操作的时候,直接使用未加转义的用户输入内容作为变量,比如下面的...

    用户4143945
  • day42_Oracle学习笔记_01

    虚拟机上的orcl数据库,所在位置:C:\app\Training\oradata\orcl

    黑泽君
  • 代码审计 | HDWiki v6.0最新版referer注入漏洞

    近期在审计HDWiki 6.0最新版cms的时候发现由referer导致的sql注入问题。SQL注入我们知道是由于代码与数据没有严格区别限制分离而导致的问题,O...

    FB客服
  • Oracle 数据库入门之----------------------多表查询

      SUM(SAL)                                                                      ...

    互联网CEO
  • 【DB笔试面试671】在Oracle中,如何监控数据库中的非常耗费性能SQL语句?

    在前边的触发器章节中介绍了如何利用系统触发器监控用户的登陆登出问题,并且可以记录所有的数据库DDL语句,这对数据库的安全审计是非常有帮助的。利用触发器还可以限制...

    小麦苗DBA宝典
  • 手把手教你-----巧用Excel批量生成SQL语句,处理大量数据

    在做系统或者做项目的时候,经常会遇到这样的要求:用户给我们发过来一些数据,要求我们把这些数据导入到数

    令仔很忙
  • 识狗君微信小程序的部署

    日历哗啦啦的往前翻,很快就要翻过2018,迎来2019年。今天预报了好久的大雪终于降临到了武汉,外面白雪皑皑,家中温暖如春,这个时候感觉最惬意。古人有诗云:绿蚁...

    云水木石

扫码关注云+社区

领取腾讯云代金券