前言
客户测试反馈说我们的代码有SQL注入的风险,查了一下确实有一处。
咱来说说SQL注入问题吧
SQL注入到底是什么
SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
SQL注入怎么产生的
1 web 开发人员无法保证所有的输入都已经过滤
2 攻击者利用发送给服务器的输入参数构造可执行的 SQL 代码(可加入到 get 请求、 post 谓求、 http 头信思、 cookie 中)
3 数据库未做相应的安全配置
如何进行SQL注入攻击
以php编程语言、 mysql数据库为例,介绍一下 SQL 注入攻击的构造技巧、构造方法
1.数字注入
在浏览器地址栏输入:
learn.me/me/sql/article.php?id = 1
这是一个 get 型接口,发送这个请求相当于调用一个查询语句
$ sql = SELECt * from article where id= $ id
正常情况下,应该返回一个 id = 1 的文章信息。那么,如果在浏览器地址栏输入:
learn.me/me/sql/article.php?id = -1 or 1=1
这就是一个 SQL 注入攻击
,可能会返回所有文章的相关倍息。为什么会这样呢?这是因为, id = 1 永远是 false , 1 = 1 永远是 true ,所有整个 where 语句永远是 ture ,所以 where 条件相当于没有加 where 条件,那么查询的结果相当于致张表的内容
2.字符串注入
有这样一个用户登录场景:登录界面包括用户名和密码输入框,以及提交按钮.输入用户名和密码,提交。这是一个post请求,登录时调用接口
Learn.me/sql/Login.html
首先连接数据库,然后后台对 post 请求参数中携带的用户名、密码进行参数校验,即 sql 的查询过程.假设正确的用户名和密码为 user 和 pwdl23 ,输入正确的用户名和密码、提交,相当于调用了以下的 SQL 语句:
SELECt * FROM user where usernanme= 'user' ADN password = 'pwd123'
由于用户名和密码都是字符串, SQL 注入方法即把参数携带的数据变成 mysql 中注释的字符串。 mysql 中有 2 种注释的方法
1.’ # ’ : ’ # ’后所有的字符串都会被当成注释来处理
用户名输入: user’# (单引号闭合 user的单引号),密码随意输入,如: 111 ,然后点击提交按钮.等价于 SQL 语句:
SELECt * from username WHERe username= 'user'# ADN password =' 111 '
要知道#后面都被注释掉了,相当于:
SELECt * from username WHERe username= 'user'
2. ‘–’(–后面有个空格):’–'后面的字符串都会被当成注释来处理
SELECt * from username WHERe username= 'user'-- ADN password =' 111 '
和上面情况一样也会当做
SELECt * from username WHERe username= 'user'
因此,以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为user 的账号
,这是十分危险的事倩。
如何预防 SQL 注入?
这是开发人员应该思考的问题,作为测试人员,了解如何预防 SQL 注入,可以在发现注入攻击 bug 时,对 bug 产生原因进行定位.
1 )严格检查输入变量的类型和格式对于整数参数,加判断条件:不能为空、参数类型必须为数字对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9] [a-z] [A-Z]范围内的字符串
2 )过滤和转义特殊字符在 username 这个变量前进行转义,对’、"、等特殊字符进行转义
3 )利用 mysql 的预编译机制
下一期会说mysql的预编译机制
就酱 拜拜
创作不易,如果本篇文章能帮助到你,请给予支持,赠人玫瑰,手有余香,虫虫蟹蟹观众姥爷了