乐趣区

面试技能1-SQL注入原因及预防

前言

客户测试反馈说咱们的代码有 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 的 预编译机制 就酱 拜拜

创作不易, 如果本篇文章能帮忙到你, 请给予反对, 赠人玫瑰, 手有余香,虫虫蟹蟹观众姥爷了

退出移动版