mysql防注入 php_PHP使用PDO实现mysql防注入功能详解
本文实例讲述了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防注入功能详解相关推荐
- pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法
当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...
- MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解
MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...
- MySQL的用户密码过期功能详解
MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...
- Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)
Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验) 参考文章: (1)Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验) (2)https://www.cnblogs.co ...
- mysql防止超发_PHP+redis实现的限制抢购防止商品超发功能详解
本文实例讲述了PHP+redis实现的限制抢购防止商品超发功能.分享给大家供大家参考,具体如下: redis不仅仅是单纯的缓存,它还有一些特殊的功能,在一些特殊场景上很好用.redis中key的原子自 ...
- php去除重复的数据保留一条,mysql查找删除重复数据并只保留一条实例详解
有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...
- pdo连接mysql 注入_使用PDO查询mysql避免SQL注入
使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严紧,就有SQL注入风险.虽然可以用mysql_real_escape_string()函数过滤用户提 ...
- php mysql 大量读取_PHP使用PDO从mysql读取大量数据处理详解
前言 本文主要介绍了关于PHP利用PDO从mysql读取大量数据处理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 环境 mysql: 5.6.34 php: 5.6 n ...
- php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
本文实例讲述了php使用PDO操作MySQL数据库的方法.分享给大家供大家参考.具体分析如下: PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在p ...
最新文章
- 鸿蒙与微信小程序,鸿蒙远程交互应用 vs 微信小程序远程交互应用
- 靶场练习第二十天~vulnhub靶场之Funbox: Scriptkiddie
- 在VirtualBox中安装BlackArch Linux
- linux基础知识——僵尸进城和孤儿进程
- jquery-等待加载-显示隐藏-遍历
- 《Go语言程序设计》读书笔记(六) 基于共享变量的并发
- 硬派SUV坦克500撞色款预计年底上市
- html 收藏功能,用react怎么实现收藏功能?
- 33. Avoid Hiding inerited names
- NV21数据的镜像算法
- 计算机的使用知识,计算机基础知识计算机的使用方法
- SqlServer 2017 下载地址及密钥下载地址
- IDEA 中 project窗口,不显示项目工程目录,解决方法
- ROS中处理回调数据
- Regionals 2015 Asia - Daejeon acmliveoj7233 - Polynomial
- 学系统集成项目管理工程师(中项)系列17a_范围管理(上)
- 60.left join(左连接)
- kubeadm init 问题和解决问题记录
- 解决VMware16无法在Win7安装VMTools的问题,报Windows 无法验证此驱动程序软件的发布者
- 为什么非常想要一样东西的时候却得不到,但慢慢就不想要了?
热门文章
- python—多线程之数据混乱问题
- [architecture]-Cortex-A53的configuration signals
- CSAPP第7章家庭作业参考答案
- vs2019+wdk10开发 xp, win7, win10 驱动
- linux route命令删除多余路由
- 别再问Cloudflare CDN 漏洞是怎么被利用的啦!这篇文就来告诉你
- 160个Crackme015
- 8、REVOKE:删除用户权限
- 求最短路径——BFS、Dijkstra、Prim算法对比
- 4.1.4 文件的物理结构(上下)