前两天看博客园新闻,有一篇文章名为《我该如何向非技术人解释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. 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求

    系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使 ...

  2. 国外社交网站获取分享数量APIs

    之前有一篇文章详细介绍了如何获取网页在Facebook,Twitter和LinkedIn社交平台上分享的数量,点击这里查看.这里再扩充一下! Twitter GET URL: http://cdn.a ...

  3. SpringMVC自定义注入controller变量

    springmvc config the controller parameter injection 问题描述 在SpringMVC中默认可以注入Model,ModelAndView,@Reques ...

  4. 为什么说Java中的随机数都是伪随机数?

    什么是伪随机数?  1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机. 2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机.   (随机这 ...

  5. 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity

    回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...

  6. Lua标准库- 模块(Modules)

    Lua包库为lua提供简易的加载及创建模块的方法,由require.module方法及package表组成 1.module (name [, ···]) 功能:建立一个模块. module的处理流程 ...

  7. 【管理心得之四十】中文“其他”、英文“other”、日文“その他”..........................................

    场景再现====================={某研讨会}本学期为:调查研究.整理总结阶段.本阶段的主要任务是: 一.学习理论,收集.汇编学习资料,提高自己的素质..... 二.通过对部分班级学生 ...

  8. html5 响应式布局

    一.什么是响应式布局?       响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本. 这个概念是为 ...

  9. javascript_core_05之正则表达式

    1. 检索关键词: ①检索固定关键词的位置: var i=str.indexOf(“关键词”,fromi):在str中查找fromi位置后,下一个关键词的下标位置:省略fromi,从0开始: var ...

  10. 2.Redis常用命令

    setget 匹配Keykeys *keys na*keys na?e 判断指定的Key是否存在exists key 删除一个或者多个keydel key//删除一个del key1 key2//删除 ...