前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工作 -- Velocity渲染SQL如何避免注入?

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

作者头像
屈定
发布2020-01-15 10:10:44
1.2K0
发布2020-01-15 10:10:44
举报
文章被收录于专栏:屈定‘s Blog屈定‘s Blog

业务开发中,会出现一些数据服务系统,既然是数据服务,那么快速提供一个业务查询配置,是必须的能力。在这个方案中,我采取了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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是SQL注入?
  • 如何避免注入?
  • Velocity渲染SQL该怎么避免注入?
    • 实现逻辑
    • 参考
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档