前两天看博客园新闻,有一篇文章名为《我该如何向非技术人解释SQL注入?》(http://kb.cnblogs.com/page/515151/)。是一个外国人写的,伯乐在线翻译的。我当时看了一下,觉得蛮通俗易懂的,对于不懂编写程序及数据库SQL语言的人来说,理解应该没有问题。

今天早上上班坐地铁,看到糗百里的一个段子(原谅一个程序猿看跟编程技术不相关网站行为),笑过之后脑海中突然就跳出了这几个字“SQL注入”!先把那个段子Copy一份,大家先轻松一下:

一哥们是送快递的,一天送快递到人家楼下,买家名字叫“猴子请来的逗比”,打电话开口就问:请问你是猴子请来的逗比吗?只听电话那头传来一声大吼:你才是逗比,你全家都是逗比!哥们只好发了个短信说是送快递的在你家楼下,没两分钟,买家下来了,说道:那个,我就是猴子请来的逗比。

我不知道其他程序猿如何看待这个笑话,但是我觉得用这个生活例子来理解SQL注入,简直太贴切了!

程序中传递SQL语句到数据库中,是以字符串的形式传递,数据库拿到完整的SQL语句字符串进行解析执行。比如说假设笑话中的买家叫张三,快递员就会打电话问:请问你是张三吗?快递员就是程序端,他把SQL字符串发送给买家,买家对“请问你是张三吗?”进行解析执行,发现这是在问他是不是名字叫张三这个人,然后判断一下给出执行结果——我是/我不是。而笑话中的买家居然叫“猴子请来的逗比”,这是买家没有将SQL语句做参数化查询,仍然将买家的名字拼接到了“请问你是”之后,并将整个SQL字符串发送给卖家,买家对“请问你是猴子请来的逗比吗?”进行解析执行,错误地理解为“请问你是逗比吗?而且还是猴子请来的”这个意思。这就导致了快递员要表达的意思,与买家理解的意思不一致的情况出现。为什么呢?因为名字中的一部分(而且大多数情况是前一部分)与“请问你是”这个执行动作能组合产生出新的执行动作语义,导致本来的执行动作语义被改变成新的执行动作语义,最终使得买家的执行结果“你才是逗比,你全家都是逗比”,并不是快递员想要的执行结果“我是/我不是”(不知道我这么说是不是符合语文上对词句的定义)。

后来又想到了参数化查询,这个SQL注入的基本防范方式。其实上面这个笑话如果把第三句“买家名字叫“猴子请来的逗比””去掉,我想大家看到“。。。你全家都是逗比!”这里,并不会觉得有什么问题。因为我们理解的语义跟买家理解的语义一样了,都跟快递员表达的语义不同。而这个笑话引发笑点的前提就是第三句,它正是起到了参数化查询的作用。当我们看到快递员打电话的问句时,我们的理解是“请问你是名字叫“猴子请来的逗比”的买家吗?”,理解为“请问你是买家吗?而且你的名字是“猴子请来的逗比””,这个语义就与快递员想要表达的语义一致了。而SQL语句的参数化查询也是起到这个作用,举个简单的例子:select * from users where user_name='xxx'。当程序端生成这个SQL字符串,它想要表达的语义就是从用户表中查找用户名是xxx的用户记录。如果不用参数化查询,并被SQL注入为"a' or 1=1--",替换xxx之后SQL字符串为select * from users where user_name='a' or 1=1--',这时数据库解析的语义就变为从用户表中查询用户名为a或者1=1的所有用户记录并忽略其后的字符串,数据库解析的语义明显跟程序端要表达的语义不一致,导致数据库返回给程序端的执行结果并不是程序端想要的执行结果(或者说编写程序的程序猿预期返回的执行结果)。而采用参数化查询后就变成这样:select * from users where user_name=@username(@username="a' or 1=1--"),数据库解析的语义为从用户表中查找用户名为@username变量中存储值的用户记录,@username变量的值为a' or 1=1--,显然一般正常情况下,没有人的用户名叫这个,因此也不会返回错误的执行结果。这样SQL语句参数化查询就起到了防SQL注入的目的,其实生活中也有类似的情况,比如上面那个笑话,如果大家跟我有一致的看法,以后也可以用上面那个生活例子向非技术人解释SQL注入这个专业名词。

最后说一句,其实SQL注入并不是中国人起的名字,这个专业名词是从SQL injection翻译得来,至于外国友人对于SQL注入这个状况为什么用injection这个单词表达,我还不得而知。

如何向非技术人(程序猿)解释SQL注入?的更多相关文章

  1. web应用程序安全攻防---sql注入和xss跨站脚本攻击

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 博文主要内容包括两种常见的web攻击 sql注入 XSS跨站脚本攻击 代 ...

  2. unity3d游戏开发猜想——当程序猿老去

    程序猿将代码注入生命去打造互联网的浪潮之巅.当有一天他们老了.会走向那里,会做些什么? 4.4.0" alt="" style="border:0px; ver ...

  3. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  4. 深入分析.NET应用程序SQL注入【危害】

    前言:   前面我们已经简单的剖析了一下.NET应用程序SQL注入.没有看过的朋友移步:http://bbs.ichunqiu.com/thread-7636-1-1.html,在上一篇文章我们已经了 ...

  5. SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

  6. 有关SQL注入的知识

    SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需要确信他们理解和防止的东西.不幸的是,开发人员往往不集中花点时间在这上面,以至他们的应用,更糟糕的是 ...

  7. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  8. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  9. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

随机推荐

  1. node.js调试

    用了几天node.js感觉很新奇,但是调试问题实在是愁煞人,开始的时候懒的学习调试方法,看看异常内容就可以了,但随着代码复杂程度的上升,并不是所有错误都是语法错误了,不调试搞不定了,只好搜搜资料,学习 ...

  2. jQuery的选择器中的通配符[id^='code']

    1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']&quo ...

  3. 浏览器 的 session 如何保持?!

    http://qindingsky.blog.163.com/blog/static/3122336200832853116360/ 在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览 ...

  4. java学习笔记--this 关键字的理解

    彻底理解this 关键字的含义 this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄. 怎么理解这段话呢 ...

  5. 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路

    以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...

  6. Html5+asp.net mvc 图片压缩上传

    在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法 ...

  7. 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序

    学习ASP.NET MVC系列: 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器 学习ASP ...

  8. Comet服务器推送与SignalR

        HTTP协议是一个典型的Request/Response协议,是基于TCP/IP之上的一个应用层协议,该协议最典型的特点就是无状态且需要客户端发起Request服务端才能进行Response, ...

  9. IOS MBProgressHUD的使用

    一,简介         苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgressHUD提供了一个替 ...

  10. mysql数据库移植

    在mysql数据库移植的时候,把自己电脑上mysql中data目录的一些重要文件复制到其他电脑上,先备份一下其他电脑上的mysql的data目录,然后替换! 例如我的mysql默认的数据库文件位置:  ...