前两天看博客园新闻,有一篇文章名为《我该如何向非技术人解释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. 简单JavaScript模版引擎优化

    在上篇博客最简单的JavaScript模板引擎 说了一下一个最简单的JavaScript模版引擎的原理与实现,作出了一个简陋的版本,今天优化一下,使之能够胜任日常拼接html工作,先把上次写的模版函数 ...

  2. 基于Vue封装分页组件

    使用Vue做双向绑定的时候,可能经常会用到分页功能 接下来我们来封装一个分页组件 先定义样式文件 pagination.css ul, li { margin: 0px; padding: 0px;} ...

  3. [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...

  4. Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

    Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结 分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据 ...

  5. Atitti 图像处理 图像混合 图像叠加 blend 原理与实现

    Atitti 图像处理 图像混合 图像叠加 blend 原理与实现 混合模式 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 混合模式是图像处理技术中的一个技术名词,不 ...

  6. Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库

    Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库1.1. 5种常用的Photoshop滤镜,分别针对照片的曝光.风格色调.黑白照片处理.锐利度.降噪这五大 ...

  7. paip.java 架构师之路以及java高级技术

    paip.java 架构师之路以及java高级技术 1.    Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...

  8. salesforce 零基础学习(二十一)workflow Q&A

    有一篇内容专门写了workflow,后来用到的时候心生疑问,不知道小伙伴有没有和我想法一样的,workflow具体内容原来已经说过,不在过多叙述,只说一下运行条件. 那就是:当满足运行条件时,执行相关 ...

  9. C++生成二级制文件过程(预处理->编译->链接 )

    转载请注明出处 Windows下C++编程,通过VC生成工程,编写C++源文件,点运行,代码没问题直接出结果.VC什么都帮我们搞了,不了解其中过程也完全没问题. 转到linux下写c++,总觉得有点虚 ...

  10. javascript_core_08之闭包、对象、原型

    1.闭包: ①外层函数包裹受保护的变量和操作变量的内层函数: ②外层函数将内层函数返回到外部: ③调用外部函数,获得内层函数的对象: 2.面向对象:用对象描述现实一个具体事物属性和功能,按需调用功能, ...