一、sql注入简介
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
二、常见的sql注入分类
1.按参数类型分类
·数字型注入:输入参数为整型时,如id、年龄和页码等。这一类的sql语句原型大概为select * from 表名 where id=1。
·字符型注入:输入参数为字符型时,如姓名、职业等;这一类的sql语句原型大概为where name='admin'。需要注意的是这里的引号有时也可能为双引号。
2.按回显类型分类
·sql回显注入
SQL回显注入又可以分为:
a.union联合查询注入
b.报错注入
·sql盲注
a.布尔盲注
b.时间注入
3.按提交方式分类
·GET注入:注入字符在URL参数中;
·POST注入:注入字段在POST提交的数据中;
·cookie注入:注入字段在Cookie数据中,网站使用通用的防注入程序,会对GET、POST提交的数据进行过滤,却往往遗漏Cookie中的数据进行过滤。
·HTTP头部注入:HTTP请求的其他内容触发的SQL注入漏洞;
三、SQL注入的危害
1. 从数据库中读取敏感数据;
2. 篡改数据库数据;
3. 对数据库执行管理权限操作;
4. 执行系统命令导致程序危害发生;
四、预防措施
1. 使用预编译。
2. 对进入数据库的特殊字符(’”尖括号&*;等)进行转义处理,或编码转换。
3. 严格限制变量类型,比如整型变量就采用intval()函数过滤,数据库中的存储字段必须对应为 int 型。
4. 数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。(前后端同时限制)
5. 网站每个数据层的编码统一,建议全部使用 UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。(UTF-7 / 宽字节注入 )
6. 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。(最小权限原则)
7. 避免网站显示 SQL错误信息,统一返回错误页面,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。