亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

使用PDO防sql注入的原理分析

2024-07-25 19:09:22
字體:
來源:轉載
供稿:網友

前言

本文使用pdo的預處理方式可以避免sql注入。下面話不多說了,來一起看看詳細的介紹吧

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

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

下邊分別說明一下上述兩點好處:

1.首先說說mysql的存儲過程,mysql5中引入了存儲過程特性,存儲過程創建的時候,數據庫已經對其進行了一次解析和優化。其次,存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接中讀取。mysql存儲過程的使用可以參看:http://www.49028c.com/article/7032.htm

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

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

在虛擬機上執行一段代碼,對遠端mysql發起請求:

<?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打開文件:

PDO,sql注入

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

查看Request Query包可以看到:

PDO,sql注入

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

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

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

針對php 5.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));

而正確的轉義應該是給mysql Server指定字符集,并將變量發送給MySQL Server完成根據字符轉義。

那么,如何才能禁止PHP本地轉義而交由MySQL Server轉義呢?

PDO有一項參數,名為PDO::ATTR_EMULATE_PREPARES ,表示是否使用PHP本地模擬prepare,此項參數默認true,我們改為false后再抓包看看。

先在代碼第一行后添加

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

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

PDO,sql注入

php對sql語句發送采用了prepare--execute方式

PDO,sql注入

PDO,sql注入

這次的變量轉義處理交由mysql server來執行。

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

使用PDO的注意事項

1.  php升級到5.3.6+,生產環境強烈建議升級到php 5.3.9+ php 5.4+,php 5.3.8存在致命的hash碰撞漏洞。

2. 若使用php 5.3.6+, 請在在PDO的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及以前版本,設置PDO::ATTR_EMULATE_PREPARES參數為false(即由MySQL server進行變量處理),php 5.3.6以上版本已經處理了這個問題,無論是使用本地模擬prepare還是調用mysql server的prepare均可。

4. 如果使用了PHP 5.3.6及以前版本, 因Yii框架默認并未設置ATTR_EMULATE_PREPARES的值,請在數據庫配置文件中指定emulatePrepare的值為false。 

注:

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

其實set names <charset>有兩個作用:

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

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

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

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品嫩草视频| 亚洲国产高清自拍| 久久精品男人天堂| 亚洲电影第1页| 亚洲国产小视频| 成人激情av在线| 中文字幕日韩精品有码视频| 91亚洲国产成人久久精品网站| 国产91精品视频在线观看| 欧美综合一区第一页| 欧美日韩国产一中文字不卡| 91最新国产视频| 亚洲第一级黄色片| 亚洲男人天堂2023| 久久视频国产精品免费视频在线| 欧美专区在线视频| 色爱精品视频一区| 国产精品一区二区3区| 成人网页在线免费观看| 欧美夜福利tv在线| 国产亚洲激情视频在线| 日韩欧美国产成人| 日韩精品免费视频| 亚洲丁香久久久| 亚洲18私人小影院| 亚洲成人精品视频| 亚洲欧美在线免费| 欧美亚洲日本网站| 午夜精品福利视频| 91精品国产777在线观看| 欧美日韩国产精品一区二区三区四区| 一区二区欧美亚洲| 精品视频偷偷看在线观看| 精品国产乱码久久久久久虫虫漫画| 亚洲国产精品免费| 日韩久久精品成人| 国产噜噜噜噜久久久久久久久| 国产精品美女免费视频| 亚洲欧美激情视频| 91精品国产高清久久久久久91| 国产mv久久久| 国产精品久久久久久久久久| 日韩网站免费观看| 97人人模人人爽人人喊中文字| 国产在线观看91精品一区| 一本一本久久a久久精品综合小说| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲美女av网站| 国产午夜精品视频| 精品福利一区二区| 美女国内精品自产拍在线播放| 91在线直播亚洲| 国产精品极品美女在线观看免费| 最新中文字幕亚洲| 亚洲伊人久久大香线蕉av| 日韩视频精品在线| 欧美精品激情在线观看| 欧美性开放视频| 亚洲精品国产拍免费91在线| 久久久久久久久综合| 中文字幕在线观看亚洲| 日韩欧美在线免费| 亚洲人成在线免费观看| 久久久91精品国产一区不卡| 91国产一区在线| 国产成人精品久久二区二区| 亚洲美女精品成人在线视频| 美女撒尿一区二区三区| 日韩精品中文字幕视频在线| 久久成人av网站| 国产日韩在线免费| 国产精品免费小视频| 日韩精品久久久久| 欧美最猛性xxxxx免费| 日韩久久精品成人| 亚洲国产精品专区久久| 有码中文亚洲精品| 亚洲美女av在线播放| 国产成人亚洲综合青青| 亚洲精品美女视频| www.亚洲一区| 精品无码久久久久久国产| 久久久欧美精品| 国产精品美女免费看| 欧美片一区二区三区| 国产69精品久久久久99| 2019中文字幕全在线观看| 欧美激情一区二区三区久久久| 国产成人精品综合久久久| 久久久av网站| 国产成人亚洲综合91精品| 欧美日韩国产一区二区三区| 亚洲色图色老头| 国产欧美一区二区三区在线看| 57pao精品| 国产69精品久久久| 国产成人精品999| 国产偷亚洲偷欧美偷精品| 亚洲激情在线观看视频免费| 97人洗澡人人免费公开视频碰碰碰| 国产精品亚洲一区二区三区| 日韩精品在线免费| 久久精品男人天堂| 97国产精品视频| 亚洲成**性毛茸茸| 成人羞羞国产免费| 亚洲一二在线观看| 6080yy精品一区二区三区| 日本老师69xxx| 午夜精品久久久久久99热软件| 欧美成aaa人片免费看| 亚洲视频777| 国产一区二区三区丝袜| 亚洲成人久久网| 在线视频一区二区| 日本精品久久久久久久| 久久久久久久久久久人体| 青青久久aⅴ北条麻妃| 日韩在线免费av| 国产精品自产拍高潮在线观看| 亚洲国产精品热久久| 成人精品aaaa网站| 欧美国产在线电影| 日韩在线中文字幕| 亚洲二区在线播放视频| 国产精品美腿一区在线看| 欧美情侣性视频| 欧美日韩精品在线视频| 日本久久中文字幕| 精品国产欧美一区二区三区成人| 91成人国产在线观看| 亚洲欧洲美洲在线综合| 中国人与牲禽动交精品| 中文字幕久热精品视频在线| 亚洲成人久久久| 精品国产欧美一区二区三区成人| 亚洲天堂开心观看| 91精品国产91久久久| 96sao精品视频在线观看| 欧美中文在线免费| 亚洲免费成人av电影| 日韩成人激情在线| 欧美乱妇40p| 日韩成人在线视频网站| 日韩资源在线观看| 韩曰欧美视频免费观看| 国产精品自拍视频| 欧美视频二区36p| 亚洲最新在线视频| 日韩美女视频中文字幕| 日韩电影中文字幕在线观看| 91久久精品久久国产性色也91| 在线观看精品国产视频| 中文日韩在线观看| 久久精品电影一区二区| 久久久精品久久| 69久久夜色精品国产69乱青草| 国产精品爽爽爽爽爽爽在线观看| 国产一区二区视频在线观看| 欧美午夜丰满在线18影院| 国产精品久久久久久久久久免费| 亚洲精品国产精品国自产在线| 国产精品va在线播放| 日本中文字幕久久看|