本文实例讲述了PHP使用PDO实现mysql防注入功能。分享给大家供大家参考,具体如下:

1、什么是注入攻击

例如下例:

前端有个提交表格:

姓名:

密码:

后台的处理如下:

$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.'


';

}

希望本文所述对大家PHP程序设计有所帮助。

mysql防注入 php_PHP使用PDO实现mysql防注入功能详解相关推荐

  1. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  2. MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解

    MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...

  3. MySQL的用户密码过期功能详解

    MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...

  4. Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)

    Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验) 参考文章: (1)Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验) (2)https://www.cnblogs.co ...

  5. mysql防止超发_PHP+redis实现的限制抢购防止商品超发功能详解

    本文实例讲述了PHP+redis实现的限制抢购防止商品超发功能.分享给大家供大家参考,具体如下: redis不仅仅是单纯的缓存,它还有一些特殊的功能,在一些特殊场景上很好用.redis中key的原子自 ...

  6. php去除重复的数据保留一条,mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  7. pdo连接mysql 注入_使用PDO查询mysql避免SQL注入

    使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严紧,就有SQL注入风险.虽然可以用mysql_real_escape_string()函数过滤用户提 ...

  8. php mysql 大量读取_PHP使用PDO从mysql读取大量数据处理详解

    前言 本文主要介绍了关于PHP利用PDO从mysql读取大量数据处理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 环境 mysql: 5.6.34 php: 5.6 n ...

  9. php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP

    本文实例讲述了php使用PDO操作MySQL数据库的方法.分享给大家供大家参考.具体分析如下: PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在p ...

最新文章

  1. 鸿蒙与微信小程序,鸿蒙远程交互应用 vs 微信小程序远程交互应用
  2. 靶场练习第二十天~vulnhub靶场之Funbox: Scriptkiddie
  3. 在VirtualBox中安装BlackArch Linux
  4. linux基础知识——僵尸进城和孤儿进程
  5. jquery-等待加载-显示隐藏-遍历
  6. 《Go语言程序设计》读书笔记(六) 基于共享变量的并发
  7. 硬派SUV坦克500撞色款预计年底上市
  8. html 收藏功能,用react怎么实现收藏功能?
  9. 33. Avoid Hiding inerited names
  10. NV21数据的镜像算法
  11. 计算机的使用知识,计算机基础知识计算机的使用方法
  12. SqlServer 2017 下载地址及密钥下载地址
  13. IDEA 中 project窗口,不显示项目工程目录,解决方法
  14. ROS中处理回调数据
  15. Regionals 2015 Asia - Daejeon acmliveoj7233 - Polynomial
  16. 学系统集成项目管理工程师(中项)系列17a_范围管理(上)
  17. 60.left join(左连接)
  18. kubeadm init 问题和解决问题记录
  19. 解决VMware16无法在Win7安装VMTools的问题,报Windows 无法验证此驱动程序软件的发布者
  20. 为什么非常想要一样东西的时候却得不到,但慢慢就不想要了?

热门文章

  1. python—多线程之数据混乱问题
  2. [architecture]-Cortex-A53的configuration signals
  3. CSAPP第7章家庭作业参考答案
  4. vs2019+wdk10开发 xp, win7, win10 驱动
  5. linux route命令删除多余路由
  6. 别再问Cloudflare CDN 漏洞是怎么被利用的啦!这篇文就来告诉你
  7. 160个Crackme015
  8. 8、REVOKE:删除用户权限
  9. 求最短路径——BFS、Dijkstra、Prim算法对比
  10. 4.1.4 文件的物理结构(上下)