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 5.3.0 安装分析心得
Aug 07 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
PHP实现变色验证码实例
Jan 06 PHP
php使用qr生成二维码的示例分享
Jan 20 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
合格的PHP程序员必备技能
Nov 13 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
PHP微信网页授权的配置文件操作分析
May 29 PHP
PHP进阶学习之依赖注入与Ioc容器详解
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 Ajax中文乱码问题解决方法
2009/02/27 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
javascript 节点排序 2
2011/01/31 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
常用DOM整理
2015/06/16 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
Vue动态创建注册component的实例代码
2019/06/14 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
值得收藏的10道python 面试题
2019/04/15 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Python之变量类型和if判断方式
2020/05/05 Python
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
文明学生标兵事迹
2014/01/21 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
大学生党性分析材料
2014/12/19 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS