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 相关文章推荐
回答PHPCHINA上的几个问题:URL映射
Feb 14 PHP
PHP similar_text 字符串的相似性比较函数
May 26 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
php将session放入memcached的设置方法
Feb 14 PHP
php实现singleton()单例模式实例
Nov 06 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 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 分页分组类
2009/12/10 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
Laravel find in set排序实例
2019/10/09 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
使用angular写一个hello world
2015/01/23 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python重要函数eval多种用法解析
2020/01/14 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
python 批量将中文名转换为拼音
2021/02/07 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
总经理助理工作职责
2014/02/06 职场文书
先进工作者获奖感言
2014/02/08 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
2016年十一促销广告语
2016/01/28 职场文书
导游词之江南周庄
2019/12/06 职场文书
Python常遇到的错误和异常
2021/11/02 Python