前言
客户测试反馈说咱们的代码有SQL注入的危险,查了一下的确有一处。
咱来说说SQL注入问题吧
SQL注入到底是什么
SQL注入是一种注入攻打,,能够执行歹意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的预编译机制
就酱 拜拜
创作不易,如果本篇文章能帮忙到你,请给予反对,赠人玫瑰,手有余香,虫虫蟹蟹观众姥爷了