报表的 SQL 注入风险是什么意思?如何防范?
啥是 SQL 注入风险?
数据库要执行 SQL 访问数据,数据库是个执行机构,它只会检查传来的 SQL 是不是合乎语法,而并不会关心这个语句是否会造成伤害(数据泄露或破坏)。正因为只要符合语法规则就会执行的机制,导致 SQL 有了注入的风险。
SQL 本身就是个字符串,而且一般没有加密,字符串可能被黑客劫持修改,这样就可能造成数据库执行了不该执行的动作。
SQL 注入的惯用做法是通过把 SQL 子串插入到 Web 表单项或页面请求(Url)的查询字符串中提交,最终达到欺骗服务器执行恶意操作的目的。
常见案例包括通过植入 SQL 骗过登录验证。而之前很多影视网站泄露 VIP 会员密码的事件,很多就是通过 SQL 植入到 WEB 表单暴露的,并且这类表单特别容易受到攻击。通过 SQL 植入,不仅可以非法获取账号信息,严重的还能够篡改、删除重要数据信息。
那么,SQL 注入和报表又有啥关系?
报表的常见数据来源是数据库,尤其关系数据库,执行 SQL 实现取数。
所有的报表工具都会提供参数功能,主要用于用户输入条件后的数据筛选。比如,希望查询指定时间段的数据,可以把时间段作为参数传递给报表,报表在从数据库中取数时将这些参数拼接到取数 SQL 的 WHERE 条件上,就可以根据不同参数取出不同数据来展现了。这种方式要求事先把查询条件做死,也就是固定了对应的条件字段。 比如下面这种传统做法:
SQL:select * from t where date>=? and date<=?
这个 SQL 专用于按时间段查询,如果想用地区查询就搞不了,需要再做一个 area=? 的查询条件或报表,显然非常麻烦……
固定条件不够,还要求更灵活,大多数报表工具又增加了通用查询功能,允许动态拼 SQL 了。比如,SQL 可以写成:
select … from T where ${mac}
其中 ${mac} 就是将来会被参数 mac 动态替换的内容。按时间段查询时,可以把 mac 拼成 date>… and data <=…,按地区查询时则拼成 area=…;当然还可以混合多条件查询拼成 data>… and date<=… and area=…;而无条件时则拼成一个永远为真的条件 1=1。
开了这个口子,报表查询条件确实灵活了,但是一旦被黑客利用,数据就危险了。
例如上面的 mac 拼入“1=0 union all select … from user”,所有的用户信息就可能完全泄露,这也解释了报表为啥有 SQL 注入风险。
知道了原因,接下来就要考虑报表如何防范 SQL 注入。
总结来说有这么几种方式:
第一种:报表不提供灵活查询的功能
也就是不用动态拼 SQL 方式开发报表,那就没办法注入干坏事儿的 SQL 串了。好处显然是避免了 SQL 注入的风险,所以像开源报表工具就直接不提供灵活条件功能(牺牲掉产品的功能,如果非要搞灵活条件只能去硬编码)。对于提供了灵活条件的产品,简单粗暴地不允许使用这个功能就是了。
第二种:写牛 X 的 SQL
找数据库管理牛人,把 SQL 搞成不管参数传来啥内容,拼到报表的 SQL 里都能保证正常条件串仍然可执行,攻击串则非法不可执行。不过这种方式只能说太麻烦、太难(一般人整不了)了,成本忒高(总不能一个报表开发人员还得配个自身 DBA?)。
还是用上面的例子,这个 SQL:select * from T where ${mac},怎么才能防住所有可能的攻击呢?
条件上加上括号,写成
select… from T where (${mac})
的形式。正常的条件串传进来仍然是合法可执行的,而上面那个攻击串传进来之后,SQL 将变成:
select… from T where (1=0 union select … from user)
这是一句不合语法的 SQL,执行会出错,风险似乎就没有了。 且慢,如果黑客把 mac 拼成
1=0) union select … from user where (1=1
整句 SQL 将变成
Select … from T where (1=0) union select … from user where (1=1)
还是一句可执行的合法 SQL,仍然会泄露信息。
原则上,我们要假定最坏情况,要保证黑客即使知道数据库结构和报表 SQL 写法时,仍然无法攻击。我们只能把这个 SQL 写得更复杂一些:
select … from T where (${mac}) or ${mac}
正常的条件串仍然还是合法可执行的,攻击串送进来会变成:
select … from T where (1=0) union select … from user where (1=1) OR 1=0) union select … from user where (1=1
这就非法了,可以挡住这个攻击。
弄成这个样子才可能挡住所有的 SQL 注入攻击,但实际上这个 SQL 已经有点复杂了,而且 SQL 写成这样,执行效率也会受到影响,条件有时候会被执行两次(当 w 为假时,第二遍 w 会没必要地再计算一次)。但为了安全性,却没有什么好办法。 这个例子说明,想挡住 SQL 注入攻击并不是非常轻松的事情,更不是一般的报表开发人员(相当多对安全意识不够强)可以做到的。
第三种:对参数值进行敏感词监测,及时拦截
只需要对参数值(SQL 子串)进行检测,当包含某些特定词(或敏感词)的时候直接拒绝继续运算报表,比如很少会用 select,from、union 等这些关键字作为库表字段名,只要判断条件串中有这些词,就认为是攻击并中断报表执行。
当然了,SQL 的条件串里正常情况下也可能会有这些关键字,但是相对较少,为了更好的安全性,这点灵活性的损失还是可以理解的。
这种方式,商业报表开发工具一般都会提供(上图敏感词配置为润乾报表实现方式),也不排除有些报表工具只提供拼 SQL 实现灵活条件的方案,但没考虑规避 SQL 注入风险,是很危险的。
总结来说,只要报表用到 SQL 的灵活条件查询功能,就存在注入风险,完全放弃此功能有点一刀切的意思,好的功能还是要发挥其作用的,我们更应该尽可能做好防范。
扩展阅读:
报表工具的 SQL 植入风险
报表的 SQL 植入风险及规避方法
对进一步报表和 BI 技术感兴趣的同学还可以搜索“乾学院”,上面有整套的免费“商业智能”技术课程,. 或者直接点下面的链接也可以 :
http://www.raqsoft.com.cn/wx/course-Business-Intelligence.html
报表的 SQL 注入风险是什么意思?如何防范?的更多相关文章
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈SQL注入风险 - 一个Login拿下Server(转)
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!
当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...
- MySQL防范SQL注入风险
MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...
- sql 注入风险
目录 sql 注入风险 什么是sql注入呢? 查看sql注入风险 如何避免 sql 注入风险 pymysql 简单规避注入风险示列 sql 注入风险 什么是sql注入呢? 参考百度 查看sql注入风险 ...
- JDBC之Statement 接口的测试(存在sql注入风险)
实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...
- 同事都说有SQL注入风险,我非说没有
前言 现在的项目,在操作数据库的时候,我都喜欢用ORM框架,其中EF是一直以来用的比较多的:EF 的封装的确让小伙伴一心注重业务逻辑就行了,不用过多的关注操作数据库的具体细节.但是在某些场景会选择执行 ...
- web安全防范之SQL注入攻击、攻击原理和防范措施
SQL注入 攻击原理 在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者可以通过注入其他语句来执行攻击操作,这些攻击包括可以通过SQL语句做的任何事 ...
- Statement 接口的应用(存在sql语句的注入风险)
实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
随机推荐
- 【拉格朗日优化dp】P4365 [九省联考 2018] 秘密袭击 coat
[拉格朗日优化dp]P4365 [九省联考 2018] 秘密袭击 coat 题目简述 求树上所有连通块第 \(k\) 大点权(不足 \(k\) 点记为 \(0\))的和. \(1\leq k\leq ...
- 在linux上安装redis并设置权限
redis是使用 c 开发,启动文件是二进制的看不到什么有用的信息,安装最新版本可以在https://redis.io/download 官网上查看,安装非常简单: mkdir /usr/redis, ...
- php time 时间 前台拿到 需要*1000能正确显示 dayjs(time*1000).format('YYYY-MM-DD HH:mm:ss')
php time 时间 前台拿到 需要1000能正确显示 dayjs(time1000).format('YYYY-MM-DD HH:mm:ss')
- 基于python的生理电信号采集的数据转换和处理软件
一 前记 团队开发了几款生物电信号采集系统,可数据处理和转换工具刚开始用的都是matlab.这对一些客户来说,使用门槛还是有些高了.开发一套配套的软件,满足广大用户的需求,已经是迫在眉睫的事情了.最近 ...
- netty Recycler对象池
前言 池化思想在实际开发中有很多应用,指的是针对一些创建成本高,创建频繁的对象,用完不弃,将其缓存在对象池子里,下次使用时优先从池子里获取,如果获取到则可以直接使用,以此降低创建对象的开销. 我们最熟 ...
- Java加密技术(五)——非对称加密算法的由来DH
Java非对称加密算法dh 接下来我们分析DH加密算法,一种适基于密钥一致协议的加密算法. DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Di ...
- 24_用Qt和FFmpeg实现简单的YUV播放器
前面文章FFmpeg像素格式转换中我们使用FFmpeg实现了一个像素格式转换工具类,现在我们就可以在Qt中利用QImage很容易的实现一个简单的YUV播放器了. 播放器功能很简单,只有播放.暂停和停止 ...
- 移远EC20 4G模块Linux驱动移植和测试
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 记录--在Vue3这样子写页面更快更高效
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能.而不 ...
- 记录--【vue3】写hook三天,治好了我的组件封装强迫症。
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 我以前很喜欢封装组件,什么东西不喜欢别人的,总喜欢自己搞搞,这让人很有成就感,虽然是重复造轮子,但是能从无聊的crud业务中暂时解脱 ...