博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pdo,更高的sql安全性
阅读量:6647 次
发布时间:2019-06-25

本文共 2027 字,大约阅读时间需要 6 分钟。

介绍

PHP 数据对象PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 来访问数据库服务。

PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。

从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行

 

为什么要使用pdo

一般我们使用mysql的使用都是用addslashes和mysql_real_escape_string 来转义后然后写入数据库(注:请弃用mysql_escape_string)

和的区别在于

区别一

addslashes不知道任何有关MySQL连接的字符集。如果你给所使用的MySQL连接传递一个包含字节编码之外的其他编码的字符串,它会很愉快地把所有值为字符'、"、\和\x00的字节进行转义。如果你正在使用不同于8位和UTF-8的其它字符,这些字节的值不一定全部都是表示字符'、"、\和\x00。可能造成的结果是,MySQL接收这些字符后出现错误。如果要修正这个bug,可尝试使用iconv函数,将变量转为UTF-16,然后再使用addslashes进行转义。

 区别二

与addslashes对比,mysql_real_escape_string同时还对\r、\n和\x1a进行转义。看来,这些字符必须正确地告诉MySQL,否则会得到错误的查询结果在GBK里,0xbf27不是一个合法的多字符字符,但0xbf5c却是。在单字节环境里,0xbf27被视为0xbf后面跟着0x27('),同时0xbf5c被视为0xbf后面跟着0x5c(\)。一个用反斜杠转义的单引号,是无法有效阻止针对MySQL的SQL注入攻击的。如果你使用addslashes,那么,我(攻击者,下同)是很幸运的。我只要注入一些类似0xbf27,然后addslashes将它修改为0xbf5c27,一个合法的多字节字符后面接着一个单引号。换句话说,我可以无视你的转义,成功地注入一个单引号。这是因为0xbf5c被当作单字节字符,而非双字节。

所以不管转义,针对针对php 5.3.6以前版本,这套方法还是可以找到漏洞的,所以请使用pdo

为什么pdo就能防止注入呢(PDO::ATTR_EMULATE_PREPARES, false

setAttribute(PDO::ATTR_EMULATE_PREPARES, false);//$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$st = $db->prepare("select * from acc_admin where uid =? and username = ?");$id = 1;$name = 'admin';$st->bindParam(1,$id);$st->bindParam(2,$name);$st->execute();$res = $st->fetchAll();var_dump($res);

 使用Wireshark抓包可以看到

这就是神奇之处,可见这次PHP是将SQL模板和变量是分两次发送给MySQL的,由MySQL完成变量的转义处理,既然变量和SQL模板是分两次发送的,那么就不存在SQL注入的问题了,但需要在DSN中指定charset属性,如:

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root');

 

使用PDO的注意事项

1. php升级到5.3.6+,生产环境强烈建议升级到php 5.3.9+ php 5.4+,php 5.3.8存在致命的hash碰撞漏洞。

2. 如果使用了PHP 5.3.6及以前版本,设置PDO::ATTR_EMULATE_PREPARES参数为false(即由MySQL进行变量处理),php 5.3.6以上版本已经处理了这个问题,无论是使用本地模拟prepare还是调用mysql server的prepare均可。在DSN中指定charset是无效的,同时set names <charset>的执行是必不可少的。

 

参考

http://php.net/manual/zh/intro.pdo.php

http://zhangxugg-163-com.iteye.com/blog/1835721

 

转载地址:http://lputo.baihongyu.com/

你可能感兴趣的文章
Android 网络编程
查看>>
设计师的视觉设计五项修炼
查看>>
转:: 刺鸟:用python来开发webgame服务端(4)
查看>>
十款被人忽视的堪称神器的软件【纯干货】
查看>>
ZOJ 3596Digit Number(BFS+DP)
查看>>
检测Java程序运行时间的2种方法(高精度的时间[纳秒]与低精度的时间[毫秒])...
查看>>
JAVA基础知识|集合
查看>>
poj 2752 - Seek the Name, Seek the Fame
查看>>
exforce_download() -- 对CI中force_download()增强后的函数(不依赖CI)
查看>>
第七次课后作业
查看>>
Python中创建守护进程
查看>>
TOJ 2703: Cow Digit Game
查看>>
将字典转换成变量, 字符串与列表相互转换
查看>>
架构中的7个设计原则
查看>>
SDUT 3374 数据结构实验之查找二:平衡二叉树
查看>>
php的错误级别
查看>>
eclipse修改android项目的apk包名类名
查看>>
斐讯路扫地机器人怎么关机_扫地机器人使用方法,使用教程
查看>>
java 二元一次方程式_JAVA求解一元一次二次方程
查看>>
python与r语言处理excel数据_R语言第一章数据处理基础①读取EXEL表格数据
查看>>