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
php实现ping
Oct 09 PHP
用PHP连mysql和oracle数据库性能比较
Oct 09 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
php中adodbzip类实例
Dec 08 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 PHP
PHP自定义错误用法示例
Sep 28 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
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 HTML代码串截取代码
2008/12/29 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
Javascript实现的分页函数
2006/12/22 Javascript
javascript iframe编程相关代码
2009/12/28 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
毕业生就业自荐书
2013/12/15 职场文书
秋游活动策划方案
2014/02/16 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
学校募捐倡议书
2014/05/14 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
群众路线对照检查材料
2014/09/22 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server