1、配置一个mysql数据库连接页面叫connectsql.php;
<?php
$dsn = 'mysql:host=localhost;port=3308;dbname=cary;charset=utf8';
$username = 'root';
$password = '';
$pdo = new PDO($dsn,$username,$password);
//var_dump($pdo);
?>
2、使用query方法查询数据库,当前端输入的是合法的用户名和密码和使用了sql注入,得到下面两种结果;
第一种当前端输入的是合法的用户名和密码;
<?php
header('content-type:text/html;charset:utf8');
//假设前端页面传过来的用户名和密码是qinshihuang和123456,分别赋值给了两个变量。
$loginname = "qinshihuang";
$loginpwd="123456";
//引用数据库连接文件
require_once 'connectsql.php';
//用前端传过来的用户名和密码查询数据库里面是否存在;
$stmt = $pdo -> query("select `username`,`password`,`chinesename` from `login`
where `username` = '{$loginname}' and `password` = '{$loginpwd}'" );
foreach ($stmt as $row) {
print $row['username'] . "<br>";
print $row['password'] . "<br>" ;
print $row['chinesename'] . "<br>";
}
//显示执行的sql语句
var_dump($stmt);
?>
输入用户名qinshihuang,密码123456,返回的值。
qinshihuang
123456
秦始皇
执行了下面的语句
C:\wamp\www\202201\login.php:20:
object(PDOStatement)[2]
public ‘queryString’ => string ‘select username
,password
,chinesename
from login
where username
= ‘qinshihuang’ and password
= ‘123456’’ (length=116)
第二种使用sql注入语句时;当前端输入用户名是 ‘ or ‘1==1’#,密码随便字符时。
//假设前端页面传过来的用户名和密码是qinshihuang和123456,分别赋值给了两个变量。
$loginname = “‘ or ‘1==1’#”;
$loginpwd=”123456”;
返回了用户表所有值如下
iubang
123456
刘邦
xiangyu
123456
项羽
liuying
123456
刘盈
liugong
123456
刘恭
qinshihuang
123456
秦始皇
执行了如下语句,伪造了username=’’ or ‘1==1’的查询条件,#以后的语句不会执行。
C:\wamp\www\202201\login1.php:20:
object(PDOStatement)[2]
public ‘queryString’ => string ‘select username
,password
,chinesename
from login
where username
= ‘’ or ‘1==1’#’ and password
= ‘123456’’ (length=117)
3、pdo预处理接入
<?php
header('content-type:text/html;charset:utf8');
//假设前端页面传过来的用户名和密码是qinshihuang和123456,分别赋值给了两个变量。
//$loginname = "' or '1==1'#";
$loginname = "qinshihuang";
$loginpwd="123456";
//引用数据库连接文件
require_once 'connectsql.php';
//pdo预处理接入
$sql = "select `username`,`password`,`chinesename` from `login` where `username` = ? and `password` = ?";
//准备要执行的语句,并返回语句对象
$stmt = $pdo->prepare($sql);
//绑定参数到指定的变量名
$stmt->bindparam(1,$loginname);
$stmt->bindparam(2,$loginpwd);
//执行一条预处理语句
$stmt->execute();
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($res);
?>
输入用户名qinshihuang,密码123456,返回的值。
C:\wamp\www\202201\login2.php:27:
array (size=1)
0 =>
array (size=3)
‘username’ => string ‘qinshihuang’ (length=11)
‘password’ => string ‘123456’ (length=6)
‘chinesename’ => string ‘秦始皇’ (length=9)
当前端输入用户名是 ‘ or ‘1==1’#,密码随便字符时,返回为空。
C:\wamp\www\202201\login2.php:27:
array (size=0)
empty