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聊天室技术
Oct 09 PHP
php array_intersect()函数使用代码
Jan 14 PHP
php面向对象 字段的声明与使用
Jun 14 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
linux下实现定时执行php脚本
Feb 13 PHP
深入理解PHP变量的值类型和引用类型
Oct 21 PHP
php实现图片上传时添加文字和图片水印技巧
Apr 18 PHP
php实现URL加密解密的方法
Nov 17 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 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自动适应范围的分页代码
2008/08/05 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
js Function类型
2011/12/04 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
Python self用法详解
2020/11/28 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
医学专业应届生的自我评价
2014/02/28 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
大学专科自荐信
2014/06/17 职场文书
学雷锋的心得体会
2014/09/04 职场文书
党员对照检查材料
2014/09/22 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
2016寒假假期总结
2015/10/10 职场文书