SQL注入是web应用程序对用户输入的数据没有严格进行合法校验和过滤,导致前端传入到后端的数据是可以恶意修改的,攻击者通过构造不同的SQL语句来实现对数据库的任意操作,这就是SQL注入漏洞的原理。 SQL注入的种类主要有以下几种: 除了以上几种,还有很多其他的SQL注入方式,后面会对这些注入方式进行详细介绍。 现在通过一个用户登录的万能密码漏洞来分析SQL注入漏洞产生的原因,测试环境如下: 在实验的测试环境中Post data一栏就是攻击者恶意修改的数据,Load URL一栏就是进行SQL注入测试的网址,点击Execute提交测试的数据: 万能密码的测试结果中看到成功登陆了,还可以使用test1用户进行发留言和删除,退出等操作。但是现在我们对于万能密码漏洞产生的原因仍然无从得知,为什么攻击者恶意伪造数据就能成功登陆?其实问题的根源就是代码逻辑不严谨,缺乏安全意识导致的。 为了进一步分析漏洞产生的原因,我们需要通过分析代码来了解前后端的数据是如何交互的,以及后端和数据库之前如何交互的。我们知道的是,点击Execute提交数据时,测试数据就随着测试的网址从前端传入到后端。 分析登录功能对应的源代码: 在以上的代码中,对于前端传入的用户名和密码等数据,后端只是简单的去除空格字符并没有进行严格的校验和过滤,直接将用户名和密码拼接成SQL语句执行。 使用var_dump函数把拼接后的SQL语句打印出来: 最终拼接出来的SQL语句是这样的:select * from users where user_name=’123′ or 1#’ and user_pass=’81dc9bdb52d04dc20036dbd8313ed055′ ,重要的是这条SQL语句在MYSQL数据库中是一定能执行成功的: 通过分析可知,前端传入的用户名和密码中带有“#”特殊字符,在MYSQL数据库中“#”字符后面的内容会被当做注释,但是后端代码并没有对“#”字符进行过滤而是直接拼接成SQL语句,也就是说,在这条SQL语句中“#”字符往后的全都当做注释了,这就导致最终拼接的SQL语句实际上是这样的:select * from users where user_name=’123′ or 1 。 MYSQL查询到了所有的数据,却只返回了第一条数据,在前端页面为啥是用的test1用户登录的呢?接着分析getRow函数的实现: 数据库查询到的所有数据都放在res对象中,但fetch_assoc函数只截取了第一条数据并返回结果,第一条数据正好是test1用户,前端页面登录时用的恰好就是test1用户。 SQL注入漏洞产生的原因主要有:前端传入后端的参数可以由用户控制,且参数拼接成SQL语句会被带入数据库中执行。在开发过程中只要满足上述所说就有可能产生SQL注入漏洞,因此在开发过程中应秉承“外部参数皆不可信”的原则进行开发。 1. 什么是SQL注入
2. 为什么会有SQL注入
3. SQL注入的种类
4. SQL注入原理
<?php /** * Created by TEST -- 用户登录 */ require "./lib/init.php"; header("Content-type:text/html;charset=utf-8"); if(empty($_POST)) { //header('Location: register.php'); echo "登录信息为空"; header("Refresh:3;url=login.php"); }else{ //是否设置用户名和密码 if(isset($_POST["user_name"]) && isset($_POST["user_pass"])){ //去除空格字符 $usename = trim($_POST["user_name"]); $password = trim($_POST["user_pass"]); //对密码进行加密,然后拼接成SQL语句 $password = md5($password); $sql = "select * from users where user_name='$usename' and user_pass='$password'"; //var_dump($sql); //exit(); //查询数据库 $selectSQL = new MySql(); $user_data = $selectSQL->getRow($sql); if($user_data!="") { session_start(); $_SESSION["user"] = $user_data["user_name"]; header("Location: user.php"); }else{ echo "用户名或者密码错误!"; header("Refresh:3;url=login.php"); } }else{ echo "登录信息不完整"; header("Refresh:3;url=login.php"); } }
//查询单行 public function getRow($sql){ $res = $this->link->query($sql); //只截取第一条记录 $row = $res->fetch_assoc(); return $row; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算