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 相关文章推荐
PHP HTML代码串 截取实现代码
Jun 29 PHP
php入门学习知识点一 PHP与MYSql连接与查询
Jul 14 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
PHP SPL标准库中的常用函数介绍
May 11 PHP
php实现复制移动文件的方法
Jul 29 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
golang 调用 php7详解及实例
Jan 04 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 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中MD5函数使用实例代码
2008/06/07 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
JsChart组件使用详解
2018/03/04 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python读取mp3中ID3信息的方法
2015/03/05 Python
用Python实现KNN分类算法
2017/12/22 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
params有什么用
2016/03/01 面试题
兼职学生的自我评价
2013/11/24 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
学习之星事迹材料
2014/05/17 职场文书
品质标语大全
2014/06/21 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
redis三种高可用方式部署的实现
2021/05/11 Redis
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python