当前位置: 首页 > news >正文

pdo mysql防注入_pdo如何防止 sql注入

我们使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制。虽然可以用 mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而使用PHP的PDO扩展的 prepare 方法,就可以避免sql injection 风险。

使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。为了解决这个问题,你必须禁用 prepared statements的仿真效果。下面是使用PDO创建链接的例子:

$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

setAttribute()这一行是强制性的,它会告诉 PDO 禁用模拟预处理语句,并使 用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了 所有可能的恶意SQL注入攻击)。

虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP( 

我们来看一段完整的代码使用实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

$dbh = new PDO("mysql:host=localhost; dbname=demo", "user", "pass");

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果

$dbh->exec("set names 'utf8'");

$sql="select * from test where name = ? and password = ?";

$stmt = $dbh->prepare($sql);

$exeres = $stmt->execute(array($testname, $pass));

if ($exeres) {

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

print_r($row);

}

}

$dbh = null;

48304ba5e6f9fe08f3fa1abda7d326ab.png

上面这段代码就可以防范sql注入。为什么呢?

当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。

但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入

1、你不能让占位符 ? 代替一组值,如:

2、你不能让占位符代替数据表名或列名,如:

SELECT * FROM blog ORDER BY ?;

3、你不能让占位符 ? 代替任何其他SQL语法,如:

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

完成。

相关文章:

  • 脉冲超声波 发射脉宽_超声波液位计和雷达液位计到底有什么不同
  • python通过什么来判断当前程序是否在_python3怎么判断进程是否存在
  • php mysql搭建个人博客_Docker最全教程之使用PHP搭建个人博客站点(二十二)
  • arcgis gp 选择图层_ArcGIS Engine实现图层间空间选择的优化策略
  • mysql 8安装 windows xp_Windows XP下安装和配置Apache2.2.22服务器+PHP5+Mysql5
  • python怎么强制转换_Python如何实现强制数据类型转换
  • 正向生成数据库mysql_数据库表反向生成 Django ORM inspectdb
  • java 泛型定义_Java中泛型定义的含义
  • 字符串转数组java_java数组与字符串相互转换、整型与字符串相互转换【详解】...
  • 简单描述mysql视图的概念_介绍mysql中视图的概念及操作
  • java web 与asp.net_JavaWeb与Asp.net工作原理比较分析
  • java 对象序列化磁盘_java对象的序列化以及反序列化详解
  • java --help_java help
  • java linux 接口_理解Java中的接口
  • java dns 缓存_Java DNS解析缓存的过期策略配置
  • Date型的使用
  • JavaScript服务器推送技术之 WebSocket
  • Java面向对象及其三大特征
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • v-if和v-for连用出现的问题
  • vue脚手架vue-cli
  • Windows Containers 大冒险: 容器网络
  • 初探 Vue 生命周期和钩子函数
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 番外篇1:在Windows环境下安装JDK
  • 批量截取pdf文件
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用API自动生成工具优化前端工作流
  • 思维导图—你不知道的JavaScript中卷
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信小程序--------语音识别(前端自己也能玩)
  • 小程序开发之路(一)
  • 小李飞刀:SQL题目刷起来!
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​queue --- 一个同步的队列类​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ###C语言程序设计-----C语言学习(3)#
  • (solr系列:一)使用tomcat部署solr服务
  • (阿里云万网)-域名注册购买实名流程
  • (八)Flask之app.route装饰器函数的参数
  • (搬运以学习)flask 上下文的实现
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)丶RabbitMQ的六大核心
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154