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学习之运算符相关概念
Jun 09 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
基于PHP选项与信息函数的使用详解
May 10 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
php多维数组去掉重复值示例分享
Mar 02 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
Jan 09 PHP
php递归遍历多维数组的方法
Apr 18 PHP
php导出中文内容excel文件类实例
Jul 06 PHP
php批量删除操作(数据访问)
May 23 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP截取中文字符串的问题
2006/07/12 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
H5图片压缩与上传实例
2017/04/21 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
详解Vite的新体验
2021/02/22 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
大学学风建设方案
2014/05/04 职场文书
求职意向书
2014/07/29 职场文书
检讨书范文1000字
2015/01/28 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
北京青年观后感
2015/06/15 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
Vue vee-validate插件的简单使用
2021/06/22 Vue.js
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
浅谈MySQL中的六种日志
2022/03/23 MySQL