PHP使用PDO实现mysql防注入功能详解
本文实例讲述了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基于pdo操作数据库技巧总结》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
- Spring Cloud Edgware新特性之九:Sleuth使用MQ方式整合Zipkin
- Linux 基础知识
- Spring Cloud Edgware新特性之八:Zuul回退的改进
- Install Django Nginx uWSGI
- Spring Cloud Edgware新特性之七:可选的EnableDiscoveryClient注解
- 【LEETCODE】模拟面试-46. Permutations
- CentOS6 Upgrade Python
- Emacs setup for Go Development
- 【LEETCODE】模拟面试-39. Combination Sum
- Docker系列教程12-使用Maven插件构建Docker镜像
- Linux nohup 用法
- 【LEETCODE】模拟面试-84-Largest Rectangle in Histogram
- Docker系列教程11-使用Nexus管理Docker镜像
- Mac 配置终端环境
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- html自定义checkbox样式
- 宝塔面板7.4.2及Windows面板6.8数据库鉴权漏洞 – 官方发布紧急安全更新
- ESP32刷入Ruff Lite固件
- Angularjs1.x ES6接入Chart图表
- 搭建Blynk开源物联网服务端(1)---基本搭建
- 搭建Blynk开源物联网服务端(2)---开始使用
- NPM安装模块报错:Error: sha1-W+8rAcUcgURBLVhzyvg+IvHsa4Q= integrity checksum failed when using sha1: wanted
- OPA Gatekeeper 策略入门
- 给Linux命令行加个问候语
- RaspberryPi接入HomeKit
- React Fetch请求
- React使用代理解决跨域问题
- React登录跳转遇到的问题
- 响应式架构与 RxJava 在有赞零售的实践
- Centos 7搭建Gitlab服务器超详细Centos 7搭建Gitlab服务器超详细(搭建成功)