一、什么是SQL注入
针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击。
Web 应用通常都会用到数据库,当需要对数据库表内的数据进行检索或添加、删除等操作时,会使用 SQL 语句连接数据库进行特定的操作。如果在调用 SQL 语句的方式上存在疏漏,就有可能执行被恶意注入(Injection)非法 SQL 语句。
下面就举例说明一下sql注入:
1、数字注入
- 正常查询数据
--所有数据 mysql> select * from class +-----+----------+ | cid | caption | +-----+----------+ | 1 | 三年二班 | | 2 | 一年三班 | | 3 | 三年一班 | | 5 | 四年一班 | +-----+----------+ 4 rows in set (0.01 sec) --加入条件获取数据 mysql> select * from class where cid>2; +-----+----------+ | cid | caption | +-----+----------+ | 3 | 三年一班 | | 5 | 四年一班 | +-----+----------+ 2 rows in set (0.01 sec)
- 进行sql注入
--可以看到根据条件查询,但是却获取到所有的数据 mysql> select * from class where cid>2 or 1=1; +-----+----------+ | cid | caption | +-----+----------+ | 1 | 三年二班 | | 2 | 一年三班 | | 3 | 三年一班 | | 5 | 四年一班 | +-----+----------+ 4 rows in set (0.00 sec)
这里SQL注入使用的漏洞就是MySQL语句中的where条件语句中参数攻击,也就是cid>2 or 1=1,or后面1=1为真就会走第二个条件,查询所有的内容。
2、以注释符号‘ -- ’来实现注入
- 正常查询数据
--正常查询数据 mysql> select * from class where cid > 1 and caption='三年一班'; +-----+----------+ | cid | caption | +-----+----------+ | 3 | 三年一班 | +-----+----------+ 1 row in set (0.00 sec)
-
注释‘--’注入
mysql> select * from class where cid > 1 -- and caption='三年一班' -> ; +-----+----------+ | cid | caption | +-----+----------+ | 2 | 一年三班 | | 3 | 三年一班 | | 5 | 四年一班 | +-----+----------+ 3 rows in set (0.00 sec)
注释‘--’后面的SQL语句会被忽略掉,所以执行的还是‘--’之前的语句
二、预防SQL注入
1、校验输入变量的类型和格式
- 利用后台语言的一些方法进行判断
对cid的值进行检验,对其进行非空以及是否为数字进行校验,例如在python的后台进行cid的校验:
>>> cid=1
>>> isinstance(1,int)
True
>>>
-
可通过正则进行校验
>>> import re >>> cid='1' >>> re.match('[0-9]*',cid).group() '1' >>> cid = '13' >>> re.match('[0-9]*',cid).group() '13'
2、加密处理
比如对用户的用户名和密码进行加密处理保存到数据库中,然后前端用户输入的用户名和密码进行加密后与数据库中的进行比较,这样就避免了SQL的注入。