SQL注入攻击

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.严格加密处理用户的机密信息。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值