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和AJAX创建RSS聚合器的代码
Mar 13 PHP
php下封装较好的数字分页方法
Nov 23 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
Apr 18 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
PHP 年龄计算函数(精确到天)
Jun 07 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
PHP常用处理静态操作类
Apr 03 PHP
CodeIgniter生成静态页的方法
May 17 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
一个颜色轮换的简单例子
2006/10/09 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
jquery操作select大全
2014/04/25 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
python计算最大优先级队列实例
2013/12/18 Python
初步理解Python进程的信号通讯
2015/04/09 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
python Pygame的具体使用讲解
2017/11/03 Python
Python I/O与进程的详细讲解
2019/03/08 Python
python 实现图片裁剪小工具
2021/02/02 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
货代行业个人求职简历的自我评价
2013/10/22 职场文书
项目采购员岗位职责
2014/04/15 职场文书
论文指导教师评语
2014/04/28 职场文书
市级文明单位申报材料
2014/05/07 职场文书
施工安全标语
2014/06/07 职场文书
国际贸易系求职信
2014/08/09 职场文书
关于诚信的活动方案
2014/08/18 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
义诊活动总结
2015/02/04 职场文书
单身证明范本
2015/06/15 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
Flask response响应的具体使用
2021/07/15 Python
设置IIS Express并发数
2022/07/07 Servers