如何向非技术人(程序猿)解释SQL注入?
前两天看博客园新闻,有一篇文章名为《我该如何向非技术人解释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注入?的更多相关文章
- web应用程序安全攻防---sql注入和xss跨站脚本攻击
kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 博文主要内容包括两种常见的web攻击 sql注入 XSS跨站脚本攻击 代 ...
- unity3d游戏开发猜想——当程序猿老去
程序猿将代码注入生命去打造互联网的浪潮之巅.当有一天他们老了.会走向那里,会做些什么? 4.4.0" alt="" style="border:0px; ver ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- 深入分析.NET应用程序SQL注入【危害】
前言: 前面我们已经简单的剖析了一下.NET应用程序SQL注入.没有看过的朋友移步:http://bbs.ichunqiu.com/thread-7636-1-1.html,在上一篇文章我们已经了 ...
- SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- 有关SQL注入的知识
SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需要确信他们理解和防止的东西.不幸的是,开发人员往往不集中花点时间在这上面,以至他们的应用,更糟糕的是 ...
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
随机推荐
- 简单JavaScript模版引擎优化
在上篇博客最简单的JavaScript模板引擎 说了一下一个最简单的JavaScript模版引擎的原理与实现,作出了一个简陋的版本,今天优化一下,使之能够胜任日常拼接html工作,先把上次写的模版函数 ...
- 基于Vue封装分页组件
使用Vue做双向绑定的时候,可能经常会用到分页功能 接下来我们来封装一个分页组件 先定义样式文件 pagination.css ul, li { margin: 0px; padding: 0px;} ...
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...
- Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结
Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结 分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据 ...
- Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
Atitti 图像处理 图像混合 图像叠加 blend 原理与实现 混合模式 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 混合模式是图像处理技术中的一个技术名词,不 ...
- Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库
Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库1.1. 5种常用的Photoshop滤镜,分别针对照片的曝光.风格色调.黑白照片处理.锐利度.降噪这五大 ...
- paip.java 架构师之路以及java高级技术
paip.java 架构师之路以及java高级技术 1. Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...
- salesforce 零基础学习(二十一)workflow Q&A
有一篇内容专门写了workflow,后来用到的时候心生疑问,不知道小伙伴有没有和我想法一样的,workflow具体内容原来已经说过,不在过多叙述,只说一下运行条件. 那就是:当满足运行条件时,执行相关 ...
- C++生成二级制文件过程(预处理->编译->链接 )
转载请注明出处 Windows下C++编程,通过VC生成工程,编写C++源文件,点运行,代码没问题直接出结果.VC什么都帮我们搞了,不了解其中过程也完全没问题. 转到linux下写c++,总觉得有点虚 ...
- javascript_core_08之闭包、对象、原型
1.闭包: ①外层函数包裹受保护的变量和操作变量的内层函数: ②外层函数将内层函数返回到外部: ③调用外部函数,获得内层函数的对象: 2.面向对象:用对象描述现实一个具体事物属性和功能,按需调用功能, ...