PHP使用PDO实现mysql防注入功能详解


Posted in PHP onDecember 20, 2019

本文实例讲述了PHP使用PDO实现mysql防注入功能。分享给大家供大家参考,具体如下:

1、什么是注入攻击

例如下例:

前端有个提交表格:

<form action="test.php" method="post">
    姓名:<input name="username" type="text">
    密码:<input name="password" type="password">
    <input type="submit" value="登陆">
  </form>

后台的处理如下:

<?php
  $username=$_POST["username"];
  $password=$_POST["password"];
  $age=$_POST["age"];
  //连接数据库,新建PDO对象
  $pdo=new PDO("mysql:host=localhost;dbname=phpdemo","root","1234");
  
  $sql="select * from login WHERE username='{$username}' AND password='{$password}' ";
  echo $sql;
  $stmt=$pdo->query($sql);
  //rowCount()方法返回结果条数或者受影响的行数
  if($stmt->rowCount()>0){ echo "登陆成功!"};

正常情况下,如果你输入姓名为小王,密码xiaowang,会登陆成功,sql语句如下:select * from login WHERE username='小王' AND password='xiaowang' 登陆成功!

但是如果你输入姓名为 ' or 1=1 #,密码随便输一个,也会登陆成功,sql语句为:select * from login WHERE username='' or 1=1 #' AND password='xiaowang' 登陆成功!

可以看到username='' or 1=1,#注释调了之后的password语句,由于 1=1恒成立,因此这条语句会返回大于1的结果集,从而使验证通过。

2、使用quote过滤特殊字符,防止注入

在sql语句前加上一行,将username变量中的‘等特殊字符过滤,可以起到防止注入的效果

//通过quote方法,返回带引号的字符串,过滤调特殊字符
$username=$pdo->quote($username);
$sql="select * from login WHERE username={$username} AND password='{$password}' ";
echo $sql;
$stmt=$pdo->query($sql);
//rowCount()方法返回结果条数或者受影响的行数
if($stmt->rowCount()>0){
  echo "登陆成功!";
};

sql语句为:select * from login WHERE username='\' or 1=1 #' AND password='xiaowang'

可以看到“'”被转义\',并且自动为变量$username加上了引号

3、通过预处理语句传递参数,防注入

//通过占位符:username,:password传递值,防止注入
$sql="select * from login WHERE username=:username AND password=:password";
$stmt=$pdo->prepare($sql);
//通过statement对象执行查询语句,并以数组的形式赋值给查询语句中的占位符
$stmt->execute(array(':username'=>$username,':password'=>$password));
echo $stmt->rowCount();

其中的占位符也可以为?

//占位符为?
$sql="select * from login WHERE username=? AND password=?";
$stmt=$pdo->prepare($sql);
//数组中参数的顺序与查询语句中问号的顺序必须相同
$stmt->execute(array($username,$password));
echo $stmt->rowCount();

4、通过bind绑定参数

bindParam()方法绑定一个变量到查询语句中的参数:  

$sql="insert login(username,password,upic,mail) values(:username,:password,:age,:mail)";
$stmt=$pdo->prepare($sql);
//第三个参数可以指定参数的类型PDO::PARAM_STR为字符串,PDO::PARAM_INT为整型数
$stmt->bindParam(":username",$username,PDO::PARAM_STR);
$stmt->bindParam(":password",$password,PDO::PARAM_STR);
$stmt->bindParam(":age",$age,PDO::PARAM_INT);
//使用bindValue()方法绑定一个定值
$stmt->bindValue(":mail",'default@qq.com');
$stmt->execute();
echo $stmt->rowCount();

使用问号做占位符:

$sql="insert login(username,password,mail) values(?,?,?)";//注意不是中文状态下的问号? 
$stmt=$pdo->prepare($sql); //按照?的顺序绑定参数值 
$stmt->bindParam(1,$username); 
$stmt->bindParam(2,$password); 
$stmt->bindValue(3,'default@qq.com'); 
$stmt->execute(); 
echo $stmt->rowCount();

使用其中bindValue()方法给第三个占位符绑定一个常量'default@qq.com',它不随变量的变化而变化。

bindColumn()方法绑定返回结果集的一列到变量:   

$sql='SELECT * FROM user';
$stmt=$pdo->prepare($sql);
$stmt->execute();
$stmt->bindColumn(2,$username);
$stmt->bindColumn(4,$email);
while($stmt->fetch(PDO::FETCH_BOUND)){
  echo '用户名:'.$username.",邮箱:".$email.'<hr/>';
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
Linux编译升级php的详细方法
Nov 04 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
详解WordPress开发中get_header()获取头部函数的用法
Jan 08 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
Laravel框架处理用户的请求操作详解
Dec 20 #PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 #PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 #PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 #PHP
You might like
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
短信提示使用 特效
2007/01/19 Javascript
javascript读取RSS数据
2007/01/20 Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
Python下简易的单例模式详解
2019/04/08 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
学雷锋演讲稿
2014/03/04 职场文书
公司合并协议书范本
2014/09/30 职场文书
团代会开幕词
2015/01/28 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
学校节水倡议书
2015/04/29 职场文书
承诺书范本大全
2015/05/04 职场文书
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技
python playwright之元素定位示例详解
2022/07/23 Python