啥是 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 注入风险是什么意思?如何防范?的更多相关文章

  1. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  2. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  3. 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  4. MySQL防范SQL注入风险

    MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...

  5. sql 注入风险

    目录 sql 注入风险 什么是sql注入呢? 查看sql注入风险 如何避免 sql 注入风险 pymysql 简单规避注入风险示列 sql 注入风险 什么是sql注入呢? 参考百度 查看sql注入风险 ...

  6. JDBC之Statement 接口的测试(存在sql注入风险)

    实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...

  7. 同事都说有SQL注入风险,我非说没有

    前言 现在的项目,在操作数据库的时候,我都喜欢用ORM框架,其中EF是一直以来用的比较多的:EF 的封装的确让小伙伴一心注重业务逻辑就行了,不用过多的关注操作数据库的具体细节.但是在某些场景会选择执行 ...

  8. web安全防范之SQL注入攻击、攻击原理和防范措施

    SQL注入 攻击原理 在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者可以通过注入其他语句来执行攻击操作,这些攻击包括可以通过SQL语句做的任何事 ...

  9. Statement 接口的应用(存在sql语句的注入风险)

    实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...

  10. Web安全相关(五):SQL注入(SQL Injection)

    简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

随机推荐

  1. 【拉格朗日优化dp】P4365 [九省联考 2018] 秘密袭击 coat

    [拉格朗日优化dp]P4365 [九省联考 2018] 秘密袭击 coat 题目简述 求树上所有连通块第 \(k\) 大点权(不足 \(k\) 点记为 \(0\))的和. \(1\leq k\leq ...

  2. 在linux上安装redis并设置权限

    redis是使用 c 开发,启动文件是二进制的看不到什么有用的信息,安装最新版本可以在https://redis.io/download 官网上查看,安装非常简单: mkdir /usr/redis, ...

  3. 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')

  4. 基于python的生理电信号采集的数据转换和处理软件

    一 前记 团队开发了几款生物电信号采集系统,可数据处理和转换工具刚开始用的都是matlab.这对一些客户来说,使用门槛还是有些高了.开发一套配套的软件,满足广大用户的需求,已经是迫在眉睫的事情了.最近 ...

  5. netty Recycler对象池

    前言 池化思想在实际开发中有很多应用,指的是针对一些创建成本高,创建频繁的对象,用完不弃,将其缓存在对象池子里,下次使用时优先从池子里获取,如果获取到则可以直接使用,以此降低创建对象的开销. 我们最熟 ...

  6. Java加密技术(五)——非对称加密算法的由来DH

    Java非对称加密算法dh     接下来我们分析DH加密算法,一种适基于密钥一致协议的加密算法. DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Di ...

  7. 24_用Qt和FFmpeg实现简单的YUV播放器

    前面文章FFmpeg像素格式转换中我们使用FFmpeg实现了一个像素格式转换工具类,现在我们就可以在Qt中利用QImage很容易的实现一个简单的YUV播放器了. 播放器功能很简单,只有播放.暂停和停止 ...

  8. 移远EC20 4G模块Linux驱动移植和测试

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. 记录--在Vue3这样子写页面更快更高效

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能.而不 ...

  10. 记录--【vue3】写hook三天,治好了我的组件封装强迫症。

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 我以前很喜欢封装组件,什么东西不喜欢别人的,总喜欢自己搞搞,这让人很有成就感,虽然是重复造轮子,但是能从无聊的crud业务中暂时解脱 ...