共计 1676 个字符,预计需要花费 5 分钟才能阅读完成。
前言
客户测试反馈说咱们的代码有 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 的 预编译机制
就酱 拜拜
创作不易, 如果本篇文章能帮忙到你, 请给予反对, 赠人玫瑰, 手有余香,虫虫蟹蟹观众姥爷了