前言
本文使用pdo的預(yù)處理方式可以避免sql注入。下面話不多說了,來一起看看詳細(xì)的介紹吧
在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)險)。 預(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://m.survivalescaperooms.com/article/7032.htm
對于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.dumpsz mysql.dump |
通過wireshark打開文件:

可以看到整個過程:3次握手--Login Request--Request Query--Request Quit
新聞熱點(diǎn)
疑難解答
圖片精選