位置: 编程技术 - 正文

MySQL解决SQL注入的另类方法详解(mysql注入的修复方式)

编辑:rootadmin

推荐整理分享MySQL解决SQL注入的另类方法详解(mysql注入的修复方式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql报错注入,mysqlsql注入例子,mysql sql注入,mysql sql注入,mysqlsql注入例子,mysqli sql注入,mysql sql注入,mysqli sql注入,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:

问题解读

我觉得,这个问题每年带来的成本可以高达数十亿美元了。本文就来谈谈,假定我们有如下 SQL 模板语句:

现在我们需要根据用户输入值填充该语句:

我们得到了下面的 SQL 语句,我们再提交给数据库:

问题在于,攻击者可以构造如下的用户输入值:

拼接好的最终语句就变成了:

攻击者成功地改变了模板语句的语义。这种问题不单单发生在 SQL 上,还出现在通常使用模板的任何语言上,比如 HTML 和 shell 脚本。

常规解决方案的说明

SQL 是具备任意性和一致性的公理,token 和派生规则构成其公理化基础。要注意的一个词语是「任意性」。与 SQL 等价的公理化数不胜数。对于这种任意等价的表示,每一条合法的语句都能被准确地映射到 SQL 里的合法语句,其它语言亦然。在这种任意等价表示中,如果某语句是不合法的,那么它在 SQL 里也是不合法的。攻击者不可能构造出可以满足任何可能的、任意与 SQL 等价的规则。

策略1:根据不同的派生规则,用另一种语法扩展模板语句

例子1:前缀语言

SQL 使用中缀表示法注1。中缀表示法等价于 lisp 风格的前缀表示法注2。中缀与前缀:

a、b、c 是标识符或值,OP1、OP2 是操作符或功能。

前缀表示法的示例语句:

该语句是等价的。它们在语义上属于外延。自动把 SQL 的中缀表示法转换成前缀表示法或其它表示法,都不算问题了。然而,攻击者的注入在前缀语法方面就是不合法的:

语法错误。攻击者想要的是:

这是不同的。攻击者的注入不能输出合法的前缀语言。

例子2:欧拉表示法

另一个替代方法将数得着欧拉表示法了。从中缀表示法到欧拉:

例子中的语句:

而注入的语句将出现语法错误:

攻击者本来是想写成:

攻击者正在做错误的事情。他的注入根本就没有注意到所选的任意标记法。

例子3:对象标记法(object notation)

MySQL解决SQL注入的另类方法详解(mysql注入的修复方式)

还有一种替代方法,对象标记法。从前缀表示法到对象:

例子的代码:

注入再一次折戟于语法:

我不再提供正确答案了,读者可以当做练习,看看攻击者应该写成什么样子。

策略2:为 SQL 选择其它任意 token

keyword 常常是一门语言里的任意 token。重要的是它们在派生规则里的位置、而非它们的任意体现。你总是可以用其它 keyword 替换现有 keyword,并且来回转换。举个例子,我们可以将下面 SQL 语句中的 keyword 转换成我们姑且称为「任意的 brainfuck」:

为了论证起见,我们将把操作数映射为 半任意的结构化序列:

phai1Oa6 是任意选取的字符序列。对于当前情形,例子:

变成了:

iph0ohKi ieZoh4xa aeZi5uja @phai1Oa6@T@ OoJ4aX4n @phai1Oa6@f1@ eeQu2Zad '{value1}' @phai1Oa6@and@ @phai1Oa6@f2@ eeQu2Zad {value2}

这是合法的、任意的 brainfuck 语言。经过注入之后,我们得到了:

iph0ohKi ieZoh4xa aeZi5uja @phai1Oa6@T@ OoJ4aX4n @phai1Oa6@f1@ eeQu2Zad 'anything' or 1=1 or a='whatever' @phai1Oa6@and@ @phai1Oa6@f2@ eeQu2Zad 5

你可以看到,它包含的 token 有 'or' 和 '=',它们在任意的 brainfuck 语言中是不合法的。我们的语法说,你必须这样使用:

这些 token 也不是操作数,因为它们将只能被视作:

换句话说,注入之后的语句就变得不合法、也不可用了。

策略3:验证不变量

你数数下面模板语句例子中的 token 有几个?

[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] '{value1}' [9] and [] f2 [] = [] {value2} 个。模板填充之后,总数必须仍然为 ,但是我们却看到了攻击者所引发的结果:

[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] 'anything' [9] or [] 1 [] = [] 1 [] or [] a [] = [] 'whatever' [] and [] f2 [] = [] 5

现在有 个 token 。违反这种不变量,就暴露了有问题的地方。同样适用于相同语句的表示,除了任意的、brainfuck 语言。模板的填充根本不可能导致 token 数量的变化。

事实上,你可以试着使用其它不变量,并在填充之后进行验证。攻击者必须和它们保持一致。

结论

有些人提倡,程序员在填充 SQL 模板时,应该更加小心。应对 SQL 注入问题,只是需要在编程方面多加小心。很明显,这种方式算不上解决方案。人们仍然在校验用户输入值方面出现错误,最终接受了带有恶意的用户输入值。换句话说,单凭我们所有人更努力地工作,是无法根本解决这种问题的。

真正的解决方案在于,SQL 语句本身的任意性,并要求所有现存不变量都符合任意的等价结构的规则。无需程序员的干预,就能自动完成。

攻击者不得不符合一种未知的、任意的 brainfuck 语法的规则。想要符合一组未知的规则,将是难以解决的问题。因此,攻击者通常无法得手。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

希望本文所述对大家MySQL数据库计有所帮助。

MySQL性能瓶颈排查定位实例详解 本文实例讲述了MySQL性能瓶颈排查定位的方法。分享给大家供大家参考,具体如下:导读从一个现场说起,全程解析如何定位性能瓶颈。排查过程收到线

MySQL异常恢复之无主键情况下innodb数据恢复的方法 本文讲述了MySQL异常恢复之无主键情况下innodb数据恢复的方法。分享给大家供大家参考,具体如下:在mysql的innodb引擎的数据库异常恢复中,一般都要求有

如何配置全世界最小的 MySQL 服务器 配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如

标签: mysql注入的修复方式

本文链接地址:https://www.jiuchutong.com/biancheng/321321.html 转载请保留说明!

上一篇:MySQL修改my.cnf配置不生效的解决方法(修改mysql配置)

下一篇:MySQL性能瓶颈排查定位实例详解(mysql性能问题)

  • PHP的反射机制实例详解(php 反代)

    PHP的反射机制实例详解(php 反代)

  • 安装SQL2005时出现的版本变更检查SKUUPGRADE=1问题的解决方法(sql2005安装不上)

    安装SQL2005时出现的版本变更检查SKUUPGRADE=1问题的解决方法(sql2005安装不上)

  • 浅析SQL Server的分页方式 ISNULL与COALESCE性能比较(sql server干嘛的)

    我们看到上述COALESCE合并的结果是可空的而ISNULL不是,有一点点不同。

    (3)COALESCE对列计算时需要持久化

    接下来我们看看二者最大的不同,我们通过计算列并且在其上面创建主键或者非空约束,看看ISNULL和COALESCE的区别

    我们再来看看COALESCE函数来计算列

    很明显我们需要对列进行持久化,通过添加PERSISTED关键字,如下即可。

    我们再来看看一个二者的不同

    我们到这里其实我们可以稍微概括下二者的区别:ISNULL着重于替换,而COALESCE着重于合并。COALESCE显示忽略了NULL并用空字符串填充并压缩,而ISNULL对NULL会用空字符串填充但不会压缩。

    (4)COALESCE函数支持超过两个参数

    对于多个参数输入,ISNULL函数需要嵌套调用,而COALESCE能够处理任何数量,至于上限不知,所以对于多个参数使用COALESCE更加,如下使用多个参数输入。

    SELECT COALESCE(a, b, c, d, e, f, g) FROM dbo.table;

    而对于ISNULL,我们需要这样做

    SELECT ISNULL(a, ISNULL(b, ISNULL(c, ISNULL(d, ISNULL(e, ISNULL(f, g)))))) FROM dbo.table;

    二者最终执行时和利用CASE一样

    (5)COALESCE和ISNULL二者性能比较

    我们来运行如下查询

    我们有查询四个场景:(1)两个参数都为NULL(2)第一个参数为NULL(3)第二个参数为NULL(4)两个参数都为NULL。每个场景测试十次,最终得出如下结果

    从上看出二者性能并未有什么太大差异,我们不需要太担心了吧,当然上述场景并未完全覆盖,至少还是能说明一部分。上述我们得到的结果查看的执行时间,现在我们再来看看二者查询执行计划。

    上述可能不太准确,还和硬件配置有关,也有可能COALESCE的性能差与ISNULL。二者性能应该是没什么很大差异。

    (6)ISNULL和自然语言描述不一致

    为何是和自然语言描述不一致呢?也就是说我们当判断某个值为NULL会做什么,不为NULL再做什么,这时用查询语言SQL描述如下:

    我们用自然语言角度来看,翻译为如果something为NULL我们做什么,这个时候是不一致的。因为在SQL Server中没有布尔值类型,上述我们只能进行如下转换

    (7)利用GUID看看奇葩的ISNULL

    在本节介绍之前我们再来看看一个例子,从而颠覆你的想法,让你发狂。

    SELECT ISNULL(NEWID(), 'JeffckyWang" class="img-responsive" alt="浅析SQL Server的分页方式 ISNULL与COALESCE性能比较(sql server干嘛的)">

    浅析SQL Server的分页方式 ISNULL与COALESCE性能比较(sql server干嘛的)

  • Win10系统自带的画图工具使用教程(win10系统自带的游戏在哪)

    Win10系统自带的画图工具使用教程(win10系统自带的游戏在哪)

  • Win8系统关闭操作中心方法步骤(如何关闭win8快速启动)

    Win8系统关闭操作中心方法步骤(如何关闭win8快速启动)

  • Win7系统安装显卡驱动后电脑一直重启的故障分析及解决方法(安装win7提示)

    Win7系统安装显卡驱动后电脑一直重启的故障分析及解决方法(安装win7提示)

  • python生成excel的实例代码(python怎么生成excel)

    python生成excel的实例代码(python怎么生成excel)

  • 公司收到生育津贴不发给员工 分录
  • 冲回存货跌价准备所得税是调增还是调减
  • 汇兑损益现金流量表列示
  • 开票名称开错了
  • 折让折扣负数发票的会计处理
  • 政府无偿划拨土地涉及的税费
  • 轿车被盗
  • 债务重组偿债顺序
  • 哪些纳税人需要实名办税
  • 行政单位明细账包括哪些
  • 财务报税表格
  • 合并报表中少数股东权益是什么意思
  • 企业未能实施个人所得税代扣代缴是否会罚款呢?
  • 银行代扣水费发票怎么开
  • 融资租赁收到租金不确认收入
  • 营业收入在财务报表上跟实际多出来怎么解释
  • 公司修理电脑属于什么费用
  • 纳税退税申请表的基本情况如何写
  • 资产负债表待摊费用出现负数
  • 收取对方损失赔偿
  • 供应商质量扣款
  • 房地产企业收取的诚意金
  • 全免增值税企业有哪些
  • 滴滴代驾报酬
  • php or
  • 电脑语言栏不见了,打不出汉字
  • 阐述python中浅复制与深复制
  • 纳税人临时到外省从事经营活动
  • 购买货物收到发票财务报表怎么提现
  • 长期借款转为实收资本怎么做账
  • vue如何销毁页面
  • 申报表已申报未交款后作废
  • 企业所得税营业外收入
  • v-model的双向绑定原理
  • 销售材料账务处理
  • 阿里月薪3万到手多少
  • ps去水印的三种方法
  • 筹建期间发生的收入
  • 配电箱安装方法
  • 会计怎样审核报销凭证
  • 帝国cms要授权吗知乎
  • 编制科目余额表的方法
  • 坏账准备抵消期初未分配利润
  • 进口产品销售需要交税吗
  • 固定资产折旧的影响因素
  • 服务费开增值税专用发票
  • 城镇土地使用税征收标准及计算方法
  • 物流公司挂靠会计处理?
  • 外经证预缴税款网上申报
  • 应付账款从质保金扣除
  • 合并报表的内部投资抵消
  • 会计师事务所工作怎么样
  • 期间费用率怎么算
  • 会计调账是什么意思
  • 生产成本如何设置明细账
  • win 10预览版
  • windows server 2008 r2最大支持内存
  • mac怎么获取文件路径快捷键
  • win10系统安装.net framework 3.5
  • macbook截
  • make:arm-linux- conmand not found错误处理探讨
  • 调整linux时间
  • vim删除^m
  • win10每周更新
  • windows 10预览版
  • linux k
  • 开发环境配置是干嘛
  • pycharm安装教程2020.2
  • js处理跨域方式及原理
  • Node.js中的什么模块是用于处理文件和目录的
  • cocos-2dx
  • Python编程给定a=1,b=4,输出a+b的值
  • js function函数
  • jquery查找指定元素
  • 软件销售增值税优惠
  • 抚州到崇仁火车时刻表
  • 企业所得税每月怎么算
  • 税务网上申报怎样操作
  • 车船税申报表样本
  • 开票信息哪里查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设