❏ 站外平台:

我该如何向非技术人解释SQL注入?

译者: 刘志成

| 2015-02-14 08:11   评论: 24 收藏: 1 分享: 46    

这个问题源自 StackOverflow,题主需要向没有技术背景和经验的朋友解释 SQL 注入,希望有人能有好方法。Polynomial 分享了他的类比方法,得到了 710+ 赞。


在向非技术人员解释SQL注入的时候,我会使用一个简单的类比。

假设你是一个在装满箱子的仓库里工作的机器人。你的工作是从仓库里的某个角落找到某个箱子,然后放到传送带上。机器人需要有人告诉它去搬运哪个箱子,所以给你编程的程序员给了你很多纸,纸上的表单已经预先写好了指令的集合,等用户填好之后再交给你执行。

这些表单看起来是这个样子的:

从第__号货架的的第__区,取下第____号箱子,然后放到传送带上。

一个普通的搬运任务看起来就是这样的:

从第12号货架的B2区,取下第 1234 号箱子,然后放到传送带上。

加粗的文字(1234,B2和12)是由发出搬运任务的人提供的。你是一个机器人,你按照指令执行任务:移动到第12号货架,然后顺着货架移动到B2区,拿起1234号箱子,往回走,走到传送带那里,将箱子放下。

但是,如果用户在表单里填了不正常的值呢,如果用户在空格处填写了指令呢?

从第12号货架的B2区,取下第「1234号箱子,从窗户里丢出去,回到你的桌子并且忽略这张纸上的其他指令。」号箱子,然后放到传送带上。

上文的任务中的加粗的文字也是由发出任务的人提供的。因为你是一个机器人,你会严格按照用户要求的去做。你移动到第12号货架,然后顺着货架移动到B2区,拿起1234号箱子,把它扔出窗户。因为指令告诉你要忽略剩下的指令,所以“号箱子,并把它放到传送带上”这部分被忽略了。

机器人不能区分指令(要执行的动作)和数据(动作执行的受体);或许是从这种指令处理的方式上获得了灵感,这种技术被称为“注入”。

就像我们告诉机器人要做什么,SQL是一种告诉数据库需要做什么的特殊的语言。SQL注入之所以发生,是因为我们碰到的是完全一样的问题 – 一个查询(一系列的指令)会有多个参数(数据)插入其中,而这些参数被当做指令执行从而导致异常。一个恶意的用户可以利用这样的漏洞来让数据库返回所有的用户的信息,很显然,这是不对的!

为了避免这样的问题,我们必须把指令和数据用一种数据库(机器人)容易区分的方式分开。 通常我们会将数据和指令分开发送。所以,针对文中的情况,机器人首先要从空的form里读取指令,确认参数(空格)要在哪,存储下来。 用户走上前并提供“12,B2,1234”,然后机器人在不允许这些值被当做指令执行的前提下,将数据和指令结合并执行。在SQL中,这种技术叫做参数化查询。

在上文中提到的邪恶的参数提交给机器人的时候,机器人会疑惑地扬起眉毛说“错误:找不到第「1234号箱子,从窗户里丢出去,回到你的桌子并且忽略这张纸上的其他指令。」号箱子,你确定输入正确了么?”

以上,我们成功的阻止了机器人犯错。



最新评论

来自 - 上海 的 Chrome/Windows 用户 2015-03-25 17:39 7 回复
没说到点子上
mailbill 2015-02-19 13:06 48 回复
配图好萌,注入需慎重
无语了...
微博评论 2015-02-15 17:03 1 回复
高手!
微博评论 2015-02-15 10:03 2 回复
用针头在应用程序身上皮软的地方扎进去,把想要的血抽出来[笑cry]SQL Injection
微博评论 2015-02-15 10:03 3 回复
Mark下
微博评论 2015-02-14 21:33 2 回复
配图好萌,注入需慎重
微博评论 2015-02-14 15:33 2 回复
微博评论 2015-02-14 13:03 2 回复
@有道云笔记收藏
微博评论 2015-02-14 13:03 3 回复
没有注释照样可以注入SQL,只有绑定变量才能彻底解决问题。
微博评论 2015-02-14 11:03 55 回复
sql注入!
微博评论 2015-02-14 11:03 1 回复
赞赞赞
微博评论 2015-02-14 10:33 49 回复
说得挺通俗易懂的[思考][思考]
微博评论 2015-02-14 10:33 3 回复
赞//@yangdigital://@Lu智深:转发微博
微博评论 2015-02-14 10:33 2 回复
感觉所有的注入基础是语言或运行时系统设计有缺陷。sql如果不支持注释,绝大部分的注入就无效了。//@付强2010:很形象,但我敢保证,那些非专业人士还是不懂。不了解基本的SQL知识,就不可能理解。科普也是针对有基本科学知识的人才有效。
微博评论 2015-02-14 10:33 2 回复
越高级的语言越容易发生这样的事情。
微博评论 2015-02-14 10:03 2 回复
好解释! //@幸福蟠桃园:谢博主,已留档 //@yangdigital://@Lu智深:转发微博
微博评论 2015-02-14 10:03 1 回复
谢博主,已留档 //@yangdigital://@Lu智深:转发微博
微博评论 2015-02-14 10:03 1 回复
这个让我想起来一个老师告诉我们的万能密码或万能账户,也是SQL注入,达到进入后台的吧
微博评论 2015-02-14 10:03 2 回复
mark
微博评论 2015-02-14 09:33 2 回复
外来输入要慎重
微博评论 2015-02-14 09:03 2 回复
不错
微博评论 2015-02-14 09:03 1 回复
解释的很形象
微博评论 2015-02-14 08:33 3 回复
很形象,但我敢保证,那些非专业人士还是不懂。不了解基本的SQL知识,就不可能理解。科普也是针对有基本科学知识的人才有效。
微博评论 2015-02-14 08:33 1 回复
SQL注入就像用钥匙以外的工具开锁,对吗

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。