pdo,更高的sql安全性

介绍

PHP 数据对象PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 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)

mysql_real_escape_stringaddslashes的区别在于

区别一

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)

<?php

$db = new PDO("mysql:host=10.0.0.234;dbname=test;","test","123456");

$db->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

时间: 2024-11-05 11:56:42

pdo,更高的sql安全性的相关文章

我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 Internet 上用于确保您通信的安全性。

早上使用.Net WebClient类采集亚马逊数据,返回http 400 Bad Request错误,内容里面有“我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 Internet 上用于确保您通信的安全性.” 所以就想着可能是WebClient使用TLS版本过低,查了下资料,全局加上这段代码. ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificat

解决&quot;System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&quot;

在用VS2008+Oracle9做环境连接Oracle时候,在VS 开发服务器运行正常,但IIS服务器调试和部署会报错! IIS服务器报错:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本. 出错的原因: 1.虽然报的是需要安装客户端8.1.7及以上版本,实际是由于.NET账户没有访问Oracle\bin文件夹的权限 2.在 Windows Server 2003/2008 或Windows XP的 NTFS系统中提供了高级的访问安全性,F

【翻译自mos文章】11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值

[翻译自mos文章]11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值 来源于: Default and Minimum MEMORY_TARGET & MEMORY_MAX_TARGET Value for ASM 11.2.0.4 and Onwards (文档 ID 1982132.1) APPLIES TO: Oracle Database - Enterprise Edition - Version 11.2.0

声明式编程——抽象程度更高,关注是什么(what),而非如何做(how)

CSDN:AngularJS的设计理念是什么?灵感来自于什么? Misko:AngularJS遵循的设计理念是--构建UI应该是声明式的.这也是AngularJS中标识符(directives)想法的灵感来源. 因此有了下文的摘录: 声明式编程和命令式编程的比较 先统一一下概念,我们有两种编程方式:命令式和声明式. 我们可以像下面这样定义它们之间的不同: 命令式编程:命令"机器"如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现. 声明式编程:告诉&qu

百度网盘搜索源码,新加分词功能,内容相关度聚合更高

百度网盘搜索源码说明: 最佳适用环境:linux(如果不是linux系统,win系统也可以,但是php天生就是跑在linux上的,linux上跑php性能不是win系统可以比拟的) 源码说明:php+mysql 关于前端:前端是基于bootstrap框架. 关于广告位:本程序是采用伪静态地址访问,可以一键增加广告位. 关于采集源:采集源是直接采集百度网盘的,这样可以避免有些失效资源问题等等. 关于程序内核:程序全部为自己开发,非套用市面上开源内核,自主开发的程序专门适用于存储云盘亿级数据,个人看

Windows 10 聚焦企业:安全程度更高、更新速度更快

Terry Myerson 曾于 1 月 21 日正式宣布,正在运行 Windows 7.Windows 8.1 及 Windows Phone 8.1 设备的客户将会获得一次免费升级到 Windows 10 的机会,当天午餐过后,他们就可以实现首年升级.我们猜想,普通消费者和很多小型企业听到这个消息一定会激动万分,这是我们有史以来首次提供如此规模的免费升级.我们相信,这将允许数百万客户午饭之后立即升级到 Windows 10,从而为我们的合作伙伴生态系统创造广泛商机,并为全部 Windows

iis System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”解决方法

今天事情特别多, 电话不断, 但事情得一件一件的做. 在用VSTS2005/2008+Oracle9做环境连接Oracle时候,在VS 开发服务器运行正常,但IIS服务器调试和部署会报错! IIS服务器报错:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本. 出错的原因: 1.虽然报的是需要安装客户端8.1.7及以上版本,实际是.net账户没有访问Oracle\bin文件夹的权限 2.在 Windows Server 2003/2008 的

如何编写更好的SQL查询:终极指南-第一部分

结构化查询语言(SQL)是数据挖掘分析行业不可或缺的一项技能,总的来说,学习这个技能是比较容易的.对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的.这个教程将会提供给你一些步骤,来评估你的查询语句. 首先,应该了解学习SQL对于数据挖掘分析这个工作的重要性; 接下来,应该先学习SQL查询语句的处理和执行过程,以便可以更好的了解到,编写高质量的查询有多重要.具体说来就是,应该了解查询是如何被解析.重写.优化和最终评估的; 掌握了上面一点之后,你不仅

(摘)Entity Framework Core 2.1带来更好的SQL语句生成方案

微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Core 2.1的第一个重要新增特性是将GroupBy操作符翻译成包含GROUP BY子句的SQL.缺乏这种支持被认为是EF Core 2.0中的一个重大疏漏. 同样,对延迟加载的支持也被纳入到EF Core 2.1中.为了支持延迟加载,现在实体的构造函数可以包含参数.在定义好构造函数后,EF Core可