博客列表 >mysql使用PDO预处理访问数据库防sql语句注入

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

浮云
浮云原创
2022年01月26日 17:38:59540浏览

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议