要想理解这个,我们得回到布尔战争,这是发生在20世纪之交的一场英国人和布尔人为了争夺南非殖民地而展开的肮脏战争。这场战争除了给世界引入了集中营和堑壕战的概念以外,还是使用无线电报的第一场战争,部队在前线就能通过电报接收到命令。前线是非常肮脏的地方,在20世纪之交的前线尤其如此,因为被污泥和马粪溅得到处都是。因为担心纸上溅落的泥巴会被无人城逗号或者句号从而改变命令的意图,英国战争部命令所有的标点符号都需要拼写出来,比方说COMMA(逗号)。至于句号他们选择了用STOP来表示,这是一种更为英式的“句号”表示法。
电报码中将句号写成STOP成为了一种实践。当大家大声读出来的时候他们会本能地读成单词STOP而不是把它当作表示句子结束的句号。
你可能会问“这跟关系式数据库有什么关系?”给关系式数据库下达的命令采用的是用可读的文本形式。这种文本是一种叫做SQL(Structured Query Language,结构化查询语言)的语言。就像电报用单词STOP来断句一样,SQL也使用标点符号来分隔命令。就像电报一样,从效果上来说数据库以文本流的形式获取命令,每句命令之间会有个STOP。
看看这个例子:
UPDATE CUSTOMER_TABLE SET NAME=“John Smith” WHERE CUSTOM_NO=2333 STOP UPDATE …
这是一条SQL语句的命令,意思是更新客户记录2333,将名字改为John Smith。
现在请留意一下引号之间的文本比如“John Smith”。这是哪儿来的?
好吧则其实是某人通过浏览器填写表格输入的。填表单的那个人输入了“John Smith”然后点击提交按钮。网站代码将输入的引号之间的文本放到SQL语句里面然后发送给数据库执行。
现在假设这位客户心存恶意这样输入他的名字:
John” STOP DELETE CUSTOMER_TABLE STOP
如果网站把它放进SQL语句的话结果会变成这个样子:
UPDATE CUSTOMER_TABLE SET NAME=“John” STOP DELETE CUSTOMER_TABLE STOP” STOP UPDATE …
可能你已经看出来发生了什么变化了。这是一条将客户表中的名字设为John的命令,会被正常执行,但只有它就会执行那位恶意客户插入的下一条命令,这条会删除整个表的数据。记住,这条命令是由具备更新数据库的充分权限的任务来完成的。
这就是所谓的“SQL注入”。
SQL注入曾经是破解网站和入侵公司最具破坏性的一项技术。超过90%的主流网站渗透都是通过SQL注入来完成的。你只需要网络一下就会看到一堆的数据泄露,受累的信用卡、被吸干的银行账号以及被暴露的个人信息高达数亿。
请在仔细观察一下这里发生的事情。数据库命令是文本形式的,而互联网用户通过web表格输入的数据会被并入该文本里面,这就给填表格的人愚弄数据库让后者不正确地解释命令创造了机会。
网友评论