日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

PDO防sql注入原理分析

發(fā)布時間:2023/12/25 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 PDO防sql注入原理分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用pdo的預(yù)處理方式可以避免sql注入。

在php手冊中'PDO--預(yù)處理語句與存儲過程'下的說明:

很多更成熟的數(shù)據(jù)庫都支持預(yù)處理語句的概念。什么是預(yù)處理語句?可以把它看作是想要運(yùn)行的 SQL 的一種編譯過的模板,它可以使用變量參數(shù)進(jìn)行定制。預(yù)處理語句可以帶來兩大好處:
查詢僅需解析(或預(yù)處理)一次,但可以用相同或不同的參數(shù)執(zhí)行多次。當(dāng)查詢準(zhǔn)備好后,數(shù)據(jù)庫將分析、編譯和優(yōu)化執(zhí)行該查詢的計(jì)劃。對于復(fù)雜的查詢,此過程要花費(fèi)較長的時間,如果需要以不同參數(shù)多次重復(fù)相同的查詢,那么該過程將大大降低應(yīng)用程序的速度。通過使用預(yù)處理語句,可以避免重復(fù)分析/編譯/優(yōu)化周 期。簡言之,預(yù)處理語句占用更少的資源,因而運(yùn)行得更快。
提供給預(yù)處理語句的參數(shù)不需要用引號括起來,驅(qū)動程序會自動處理。如果應(yīng)用程序只使用預(yù)處理語句,可以確保不會發(fā)生SQL 注入。(然而,如果查詢的其他部分是由未轉(zhuǎn)義的輸入來構(gòu)建的,則仍存在 SQL 注入的風(fēng)險(xiǎn))。
預(yù)處理語句如此有用,以至于它們唯一的特性是在驅(qū)動程序不支持的時PDO 將模擬處理。這樣可以確保不管數(shù)據(jù)庫是否具有這樣的功能,都可以確保應(yīng)用程序可以用相同的數(shù)據(jù)訪問模式。

下邊分別說明一下上述兩點(diǎn)好處:

1.首先說說mysql的存儲過程,mysql5中引入了存儲過程特性,存儲過程創(chuàng)建的時候,數(shù)據(jù)庫已經(jīng)對其進(jìn)行了一次解析和優(yōu)化。其次,存儲過程一旦執(zhí)行,在內(nèi)存中就會保留一份這個存儲過程,這樣下次再執(zhí)行同樣的存儲過程時,可以從內(nèi)存中直接中讀取。mysql存儲過程的使用可以參看:http://maoyifa100.iteye.com/blog/1900305

對于PDO,原理和其相同,只是PDO支持EMULATE_PREPARES(模擬預(yù)處理)方式,是在本地由PDO驅(qū)動完成,同時也可以不使用本地的模擬預(yù)處理,交由mysql完成,下邊會對這兩種情況進(jìn)行說明。

2.防止sql注入,我通過tcpdump和wireshark結(jié)合抓包來分析一下。

在虛擬機(jī)上執(zhí)行一段代碼,對遠(yuǎn)端mysql發(fā)起請求:

<?php

$pdo = new PDO("mysql:host=10.121.95.81;dbname=thor_cms;charset=utf8", "root","qihoo@360@qihoo");

$st = $pdo->prepare("select * from share where id =? and uid = ?");

$id = 6;
$uid = 521;

$st->bindParam(1, $id);
$st->bindParam(2, $uid);

$st->execute();
$ret = $st->fetchAll();

print_r($ret);

通過tcpdump抓包生成文件:

tcpdump -ieth0 -A -s 3000 port 3306 -w ./mysql.dump

sz mysql.dump

通過wireshark打開文件:

可以看到整個過程:3次握手--Login Request--Request Query--Request Quit

查看Request Query包可以看到:

咦?這不也是拼接sql語句么?

其實(shí),這與我們平時使用mysql_real_escape_string將字符串進(jìn)行轉(zhuǎn)義,再拼接成SQL語句沒有差別,只是由PDO本地驅(qū)動完成轉(zhuǎn)義的(EMULATE_PREPARES)

這種情況下還是有可能造成SQL 注入的,也就是說在php本地調(diào)用pdoprepare中的mysql_real_escape_string來操作query,使用的是本地單字節(jié)字符集,而我們傳遞多字節(jié)編碼的變量時,有可能還是會造成SQL注入漏洞(php5.3.6以前版本的問題之一,這也就解釋了為何在使用PDO時,建議升級到php5.3.6+,并在DSN字符串中指定charset的原因)。

針對php5.3.6以前版本,以下代碼仍然可能造成SQL注入問題:

$pdo->query('SET NAMES GBK'); 

$var = chr(0xbf) . chr(0x27) . " OR 1=1 /*"; 

$query = "SELECT * FROM info WHERE name = ?"; 

$stmt = $pdo->prepare($query); 

$stmt->execute(array($var)); 

而正確的轉(zhuǎn)義應(yīng)該是給mysqlServer指定字符集,并將變量發(fā)送給MySQLServer完成根據(jù)字符轉(zhuǎn)義。

那么,如何才能禁止PHP本地轉(zhuǎn)義而交由MySQLServer轉(zhuǎn)義呢?

PDO有一項(xiàng)參數(shù),名為PDO::ATTR_EMULATE_PREPARES,表示是否使用PHP本地模擬prepare,此項(xiàng)參數(shù)默認(rèn)true,我們改為false后再抓包看看。

先在代碼第一行后添加

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

再次用tcpdump抓包,通過wireshark我們可以看到:

php對sql語句發(fā)送采用了prepare--execute方式

這次的變量轉(zhuǎn)義處理交由mysql server來執(zhí)行。

既然變量和SQL模板是分兩次發(fā)送的,那么就不存在SQL注入的問題了,但明顯會多一次傳輸,這在php5.3.6之后是不需要的。

使用PDO的注意事項(xiàng)

1.php升級到5.3.6+,生產(chǎn)環(huán)境強(qiáng)烈建議升級到php5.3.9+ php 5.4+,php5.3.8存在致命的hash碰撞漏洞。

2. 若使用php 5.3.6+, 請?jiān)谠赑DO的DSN中指定charset屬性。小于5.3.6 :$dbh = new PDO($dsn,$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
3. 如果使用了PHP 5.3.6及以前版本,設(shè)置PDO::ATTR_EMULATE_PREPARES參數(shù)為false(即由MySQL server進(jìn)行變量處理),php 5.3.6以上版本已經(jīng)處理了這個問題,無論是使用本地模擬prepare還是調(diào)用mysql server的prepare均可。

4.如果使用了PHP 5.3.6及以前版本, 因Yii框架默認(rèn)并未設(shè)置ATTR_EMULATE_PREPARES的值,請?jiān)跀?shù)據(jù)庫配置文件中指定emulatePrepare的值為false。

注:

1.為什么在DSN中指定了charset, 還需要執(zhí)行set names <charset>呢?

其實(shí)set names <charset>有兩個作用:

  告訴mysql server, 客戶端(PHP程序)提交給它的編碼是什么

告訴mysql server, 客戶端需要的結(jié)果的編碼是什么

也就是說,如果數(shù)據(jù)表使用gbk字符集,而PHP程序使用UTF-8編碼,我們在執(zhí)行查詢前運(yùn)行set names utf8, 告訴mysql server正確編碼即可,無須在程序中編碼轉(zhuǎn)換。這樣我們以utf-8編碼提交查詢到mysql server, 得到的結(jié)果也會是utf-8編碼。省卻了程序中的轉(zhuǎn)換編碼問題,不要有疑問,這樣做不會產(chǎn)生亂碼。

那么在DSN中指定charset的作用是什么? 只是告訴PDO, 本地驅(qū)動轉(zhuǎn)義時使用指定的字符集(并不是設(shè)定mysql server通信字符集),設(shè)置mysql server通信字符集,還得使用set names <charset>指令。

2.PDO::ATTR_EMULATE_PREPARES屬性設(shè)置為false引發(fā)的血案:http://my.oschina.net/u/437615/blog/369481

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

總結(jié)

以上是生活随笔為你收集整理的PDO防sql注入原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区三区在线电影 | 中文字幕88 | 三级视频在线播放 | 国产妻精品一区二区在线 | 亚洲精品免费视频 | 涩涩网站入口 | 国产美女网站 | 岛国av免费在线 | 男人懂得网站 | 韩国三级视频在线 | 国产人妻精品一区二区三区不卡 | 一区二区中文 | 久久国产成人 | 亚洲第一免费 | 国产区欧美区日韩区 | 天堂色网 | 国产精品欧美一区二区 | 夜夜躁日日躁狠狠久久av | 国产性―交一乱―色―情人 | 国产亚洲精品网站 | 你懂的国产 | 日韩美女网站 | 日韩av一二三区 | 国产又粗又猛视频免费 | 五月亚洲婷婷 | 无码一区二区三区免费视频 | 福利综合网 | 97xxxx| 久久久久人妻一区精品 | 免费毛片a | 黄色另类小说 | 国产在线拍揄自揄拍无码 | 免费av毛片 | 久久久久久久久免费 | 国产九九九精品 | 国产高清精品在线观看 | 男女男网站 | 国产56页| 爱久久 | 影音先锋欧美资源 | 经典三级视频 | 少妇欧美激情一区二区三区 | 亚洲精品免费网站 | 中字av在线 | 亚洲人成人一区二区在线观看 | 日日射日日干 | 国产成人精品123区免费视频 | 日韩男女啪啪 | 黄色成年视频 | 中文字幕91 | 色综合色婷婷 | 爱综合网 | 国产精品一品二区三区的使用体验 | 最近免费中文字幕大全免费版视频 | 高清二区| 亚洲自拍偷拍精品 | 亚洲精品www.| 婷婷丁香六月 | 久久超| 国产又粗又猛又爽69xx | 亚洲av永久无码国产精品久久 | 国产福利专区 | 在线观看第一页 | 日韩视频免费观看高清完整版在线观看 | 成年人国产精品 | 美女流白浆视频 | 久久97精品 | 精品国产乱码久久久久久蜜臀 | 最新版天堂资源在线 | 一出一进一爽一粗一大视频 | 少妇2做爰交换朴银狐 | 日本老熟妇乱 | 日本一区二区三区视频免费看 | 久久久久久久久艹 | 久草青青草| 人人妻人人澡人人爽人人欧美一区 | 国产片久久| 久久久天天 | 日本欧美色 | 视频一区二区中文字幕 | 亚色在线| 欧美一区二区久久久 | av在线免播放器 | 91精品国产综合久久香蕉922 | 国产又粗又长 | 69xx欧美 | 中文在线不卡视频 | 91网站免费在线观看 | 色导航 | 欧美激情亚洲色图 | 成人黄色激情小说 | 成人一级在线 | 日韩av一区二区三区四区 | 91爱爱网站 | 全黄性性激高免费视频 | 毛片基地在线播放 | 欧美午夜视频在线观看 | 国产在线视频导航 | 999精品在线观看 |