本篇文章给大家分享的是有关SQL中 Injection的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
SQL Injection,SQL 注入,其实就是利用代码漏洞改变 SQL 的语意,从而形成恶意 SQL 语句
$username = $_POST['username']; $password = $_POST['password']; $query = "select * from users where username = '{$username}' and password = '{$password}'"; // 判断是否登录成功 if (DB::select($query)) { return true; } return false;
咋一看这段伪代码没啥问题,就是判断账号密码是否正确,正确就返回 true,允许登录。但是如果传入的 username 为 123' or 1=1;#\,那么 SQL 语句就变为了
select * from users where username = '123' or 1=1; # and password = '{$password}'";
这条恶意的 SQL 语句无论何时都会返回 true,因为 1=1
我们前面讲过 SQL Injection 就是利用代码漏洞改变 SQL 的语意,意味着 ORM 也是一个潜在的注入点。以 tp3.2 为例,有下面这段代码
$result = D('User')->where([ 'username' => $_POST['username'], 'password' => $_POST['password'], ]); if ($result) { echo '登录成功'; } else { echo '登录失败'; }
这段代码咋看起来没啥问题,但是如果 username 传入的是 username[0]=neq&username[1]=1111,这样就是的查询语句变为
$result = D('User')->where([ 'username' => ['neq', 111], 'password' => $_POST['password'], ]);
那么 $result 的结果将永远为 true
对传入的参数进行数据类型判断和数据类型转换
对引号进行转义,PHP 可以使用 addslashes,mysql_real_escape_string 等函数
预处理语句,最有效防范 SQL Injection
代码审计
预处理语句是由数据库实现的,比如 MySQL 就有实现预处理语句。首先讲下预处理的基本流程
MySQL 接收到 预处理 SQL Template,立刻着手进行解析(词法和语法)
客户端发送数据,去替换 SQL Template 中的占位符(?)
MySQL 执行语句,返回结果
删除预处理语句(可选)
那么预处理语句是如何防范 SQL 注入的呢?首先所谓的 SQL Injection 就是强行去改变 SQL 语意。而在步骤一中已经处理完成语句,将 SQL 的语意固定下来,步骤二的替换占位符并不会改变 SQL 语意。下面是 PHP PDO 的例子
$stmt = $pdo->prepare("select * from users where username = '?' and password = '?'"); $stmt->execute("123' or 1=1;#", 'test');
以上就是SQL中 Injection的作用是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。