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初学者头疼问题总结
Jul 08 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
php 删除记录实现代码
Mar 12 PHP
QQ登录 PHP OAuth示例代码
Jul 20 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
php网页标题中文乱码的有效解决方法
Mar 05 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
Jan 04 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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设计模式之代理模式的深入解析
2013/06/13 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
python打包成so文件过程解析
2019/09/28 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
浅析Python 条件控制语句
2020/07/15 Python
用python批量移动文件
2021/01/14 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
戴尔美国官网:Dell
2016/08/31 全球购物
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
小学音乐教学反思
2014/02/05 职场文书
安全标准化实施方案
2014/02/20 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
三方股东合作协议书
2014/10/28 职场文书
工会工作个人总结
2015/03/03 职场文书
党小组鉴定意见
2015/06/02 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android