欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql使用PDO预处理访问数据库防sql语句注入

程序员文章站 2022-03-07 18:14:07
...

1、配置一个mysql数据库连接页面叫connectsql.php;

  1. <?php
  2. $dsn = 'mysql:host=localhost;port=3308;dbname=cary;charset=utf8';
  3. $username = 'root';
  4. $password = '';
  5. $pdo = new PDO($dsn,$username,$password);
  6. //var_dump($pdo);
  7. ?>

2、使用query方法查询数据库,当前端输入的是合法的用户名和密码和使用了sql注入,得到下面两种结果;

第一种当前端输入的是合法的用户名和密码;

  1. <?php
  2. header('content-type:text/html;charset:utf8');
  3. //假设前端页面传过来的用户名和密码是qinshihuang和123456,分别赋值给了两个变量。
  4. $loginname = "qinshihuang";
  5. $loginpwd="123456";
  6. //引用数据库连接文件
  7. require_once 'connectsql.php';
  8. //用前端传过来的用户名和密码查询数据库里面是否存在;
  9. $stmt = $pdo -> query("select `username`,`password`,`chinesename` from `login`
  10. where `username` = '{$loginname}' and `password` = '{$loginpwd}'" );
  11. foreach ($stmt as $row) {
  12. print $row['username'] . "<br>";
  13. print $row['password'] . "<br>" ;
  14. print $row['chinesename'] . "<br>";
  15. }
  16. //显示执行的sql语句
  17. var_dump($stmt);
  18. ?>

输入用户名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预处理接入

  1. <?php
  2. header('content-type:text/html;charset:utf8');
  3. //假设前端页面传过来的用户名和密码是qinshihuang和123456,分别赋值给了两个变量。
  4. //$loginname = "' or '1==1'#";
  5. $loginname = "qinshihuang";
  6. $loginpwd="123456";
  7. //引用数据库连接文件
  8. require_once 'connectsql.php';
  9. //pdo预处理接入
  10. $sql = "select `username`,`password`,`chinesename` from `login` where `username` = ? and `password` = ?";
  11. //准备要执行的语句,并返回语句对象
  12. $stmt = $pdo->prepare($sql);
  13. //绑定参数到指定的变量名
  14. $stmt->bindparam(1,$loginname);
  15. $stmt->bindparam(2,$loginpwd);
  16. //执行一条预处理语句
  17. $stmt->execute();
  18. $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  19. var_dump($res);
  20. ?>

输入用户名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