SQL注入攻击
如何理解SQL注入攻击
SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。
SQL注入是输入参数未经过过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为。称之为SQL注入攻击。
SQL注入是如何产生的
1.WEB开发人员无法保证所有的输入都已经过滤。
2.攻击者利用发送给SQL服务器的输入参数构造可执行的SQL语句(可加入到get请求、post请求、http头信息、cookies中)。
3.数据库未做相应的安全配置。
实现注入攻击的具体手段
1.数字注入:
sql = "select * from reg where id={};".format(userid)
正常情况下输入一个数据库内不存在的userid是查找不到数据的,但是如果userid = “999 or 1=1”,id数字后面的 'or 1=1’混入到了sql语句中,就相当于了
sql = "select * from reg where id=999 or 1=1;"
1=1永远为True,返回了当前table的所有信息
2.字符串注入
原理和上面数字的注入方法是相同的,只不过是利用MySQL的注释。
sql = "select * from reg where username='user'#' AND PASSWORD='PWD'"
#把sql语句后面的逻辑部分语句给注释掉了,这样就相当于
sql = "select * from reg where username='user'"
返回的自然是整张表的信息…
如何防御SQL注入
这是开发人员应该思考的问题,作为测试人员,了解如何预防SQL注入,可以在发现注入攻击BUG时,对BUG产生原因进行定位。
1.严格检查输入变量的类型和格式
- 对于整数参数,加判断条件:不能为空、参数类型必须为数字
- 对于字符串参数,可以使用正则表达式进行过滤
2.过滤和转义特殊字符
在username这个变量前,进行转义,对’、"、\等特殊字符进行转义
3.利用mysql的预编译机制
这是最常用也是可以说必须用的解决SQL注入攻击的一种手段。
sql = "select * from reg where id=%s"
data = (999,)
curser.execute(sql,data)
参数化查询是不但解决了SQL注入的问题,效率也比sql语句拼接要高。
把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。
总结
1.不要随意开启生产环境中Webserver的错误显示。
2.永远不要相信来自客户端的输入,有固定的格式的变量一定要颜色检查对应的格式,没有固定格式的变量需要对引号等特殊字符进行必要的过滤转义。
3.使用预编译绑定变量的SQL语句。
4.做好数据库账号权限管理。
5.严格加密处理用户的机密信息。