热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL解决SQL注入的另类方法详解_MySQL

这篇文章主要介绍了MySQL解决SQL注入的另类方法,结合实例形式列举分析了几种防止SQL注入的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:

问题解读

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

select * from T where f1 = '{value1}' and f2 = {value2}

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

value1=hello
value2=5

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

select * from T where f1='hello' and f2=5

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

value1=anything' or 1=1 or f1='whatever
value2=5

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

select * from T where f1='anything' or 1=1 or f1='whatever' and f2=5

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

常规解决方案的说明

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

代码如下:

(select * T (and (= f1 'anything' or 1=1 or a='whatever') (= f2 5)))

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

代码如下:

(select * T (or (= f1 'anything') (or (=1 1) (and (= a 'whatever') (= f2 5)))))

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

例子2:欧拉表示法

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

a OP1 b OP2 c <=> OP1(a,OP2(b,c))

例子中的语句:

select( *,T,and(=(f1,'{value1}'),=(f2,{value2})))

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

代码如下:

select( *,T,and(=(f1,'anything' or 1=1 or a='whatever'),=(f2,5)))

攻击者本来是想写成:

代码如下:

select( *,T,or(=(f1,'anything',or(=(1,1),and(=(a,'whatever'),=(f2,5))))))

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

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

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

a OP1 b OP2 c <=> a.OP1(b).OP2(c)

例子的代码:

T.where(f1.=('{value1}').and(f2.=({value2})).select(*)

注入再一次折戟于语法:

T.where(f1.=('anything' or 1=1 or a='whatever').and(f2.=5)).select(*)

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

代码如下:

{"select":"iph0ohKi", "*":"ieZoh4xa", "from":"aeZi5uja", "where":"OoJ4aX4n", "=":"eeQu2Zad", "(":"eiD5aera",")":"Soo2uach", "or":"Ocaig5Es"}

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

T <=> @phai1Oa6@T@
hello <=> @phai1Oa6

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

select * from T where f1 = '{value1}' and f2 = {value2}

变成了:

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

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

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

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

or <=> Ocaig5Es
= <=> eeQu2Zad

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

or <=> @phai1Oa6
= <=> @phai1Oa6@=@

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

策略3:验证不变量

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

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

[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] 'anything' [9] or [10] 1 [11] = [12] 1 [13] or [14] a [15] = [16] 'whatever' [17] and [18] f2 [19] = [20] 5

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

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

结论

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

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

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

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

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

推荐阅读
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • HTML前端开发:UINavigationController与页面间数据传递详解
    本文详细介绍了如何在HTML前端开发中利用UINavigationController进行页面管理和数据传递,适合初学者和有一定基础的开发者学习。 ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
author-avatar
雪天使杨果果
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有