什么是sql注入?
通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合;
通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统;
例子:
比如在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录:
用户名: ‘or 1 = 1 –
密 码:
点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)
这是为什么呢? 下面我们分析一下:
从理论上说,后台认证程序中会有如下的SQL语句:
String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";
当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username='’or 1 = 1 -- and password='’
分析SQL语句:
条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;
然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
这个是一般的读操作,如果操作的为写操作,后果可想而知;
漏洞分类:
1. 平台层SQL注入:
不安全的数据库配置或数据库平台的漏洞所致;(权限)
2. 代码层SQL注入:(比较常见)
程序员对输入未进行细致地过滤从而执行了非法的数据查询或者写操作;
在实际的项目中,mysql做复杂查询时,往往会存在手拼sql的操作。如果不谨慎就会产生sql注入。
防护建议:
1.对用户的输入进行校验,可以进行强类型校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
2.不要使用动态拼装sql,可以使用参数化的sql
3.不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
6.不安全的数据库;
7.数据层用强类型语言;
如果代码的实现方案时弱类型语言,必然存在函数传入参数难以控制的情况。为了保证类型的有效性和参数的有效性,每一级都要判断强转,实现成本较高。所以应该使用强类型语言如golang实现数据层,优先保证类型一致,在类型一致的基础上保证数据有效。
慕课网:https://www.imooc.com/learn/883
案例总结: