SQL注入问题想必大家都会有所听闻,因为也许大家都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。
SQL注入的发生,通常是恶意用户通过在表单中填写包含SQL关键字的数据,来使数据库执行非常规逻辑的过程。简单来说,就是数据库越界做了超出代码控制范围的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
SQL注入的场景还原
假设有一个用户表users,往用户表中插入一条数据的语句是:
insert into users(name) values('yanggb');
其中的name字段来源于表单页面中的input,这时有一个不怀好意的用户填写的name字段为【'yanggb');drop table users;--】,那么这时候上面的语句就变成:
insert into users(name) values('yanggb');drop table users;--);
一整行可能有点看不清楚,我们来格式化看一下:
insert into users(name) values('yanggb'); drop table users; --);
这时候,一条语句就变成了两条语句,其中第二条语句清空了用户表中的所有记录。
这样的骚操作,就是SQL注入。
防止SQL注入问题的方法
既然知道了有SQL注入的问题,也知道SQL注入问题的产生原因,就要想办法去防止SQL注入问题了。
数据项的关键字检查
先说一个最简单的方法,也是最容易想到的。因为既然注入问题是因为执行了数据项中的SQL关键字,那么只需要执行SQL前检查数据项中是否存在SQL关键字就好了。
实际上,很多数据库管理系统都是采用了这种看似方便快捷的方法。但是这种方法却并不是从根源上解决问题的方法,因为说不定上面的用户就是喜欢叫这个名字呢。
尽量避免使用常见的数据库名和数据库结构
在上面的场景还原中,如果数据库表的名称不是叫users,而是叫uuuuuuuuusers,那么注入的代码在执行的过程中就会报错,也就不会发生数据丢失的情况了。
实际上,SQL注入也并不是那么简单的,一个前提就是需要攻击者本身对数据库的结构有足够的了解才能够成功。因此在构建数据库的时候要尽量使用较为复杂的结构和命名方式,就能有效降低被攻击成功的概率。
使用正则表达式等字符串过滤手段限制数据项的格式
使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好的防护措施。
理论上来说,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入问题的发生。
使用ORM框架提供的方法
一些ORM框架提供了完善的SQL执行方案,能有效防止SQL注入问题。
总结
当然了,除了在SQL执行上的层面上预防SQL注入问题,还可以通过数据库备份和对敏感内容进行加密来保护数据。
事实上,某些安全性问题可能永远不会有完美的解决方案的,只有我们时刻保持警惕,并做好最基本的防护措施,才能在发生问题的时候及时反应,保证数据的最小损失。
"如果只是浑浑噩噩得度过每一天,十年后的今天和今天可能也不会有什么不同。"