摘要:具體參考基于擴(kuò)展實(shí)現(xiàn)真正的數(shù)據(jù)庫連接池方式三加上參考文檔參數(shù)化查詢?yōu)槭裁茨軌蚍乐棺⑷?/p>
pdo防sql注入原理
PdoTest.php
class PdoTest() { protected $db; protected $user; protected $pass; public function __construct($user = "root", $pass = 123456) { $this->user = $user; $this->pass = $pass; $this->db = new PDO("mysql:host=localhost;dbname=test", $this->user, $this->pass); } function test() { //$userName = "tomener" or 1=1;--"; $userName = "tomener"; $userName = isset($_GET["userName"]) ? trim($_GET["userName"]) : $userName; echo "
" . $userName . "
"; // 方式一 $sql = "select * from user where userName = ? and status = ?"; $stmt = $this->db->prepare($sql); $stmt->execute(array($userName, 1)); $user_info = $stmt->fetch(PDO::FETCH_ASSOC); echo "";var_dump($user_info); // 方式二 $sql = "select * from user where userName = "". $userName ."" and status = 1" $stmt =$this->db->prepare($sql); $stmt->execute(); $user_info = $stmt->fetchAll(PDO::FETCH_ASSOC); echo "";var_dump($user_info); } } $PdoTest = new PdoTest(); $PdoTest->test();訪問:
http://localhost/PdoTest.php狀態(tài):方式一、方式二都正常
訪問:
http://localhost/PdoTest.php?userName=tomener" or 1=1;-- http://localhost/PdoTest.php?userName=tomener%27%20or%201=1;--狀態(tài):方式一返回false,方式二返回user表所有數(shù)據(jù)
問題來了,為什么pdo預(yù)處理能正確處理sql注入呢?mysql預(yù)處理語句,mysql支持預(yù)處理,sql已經(jīng)預(yù)編譯好了,坑已經(jīng)挖好了,來一個填一個,不會改變原本sql的意思,那么后面的or 1=1;--根本不會被mysql編譯成執(zhí)行計(jì)劃,被當(dāng)作普通的字符串處理,沒任何意義。
通俗的理解,就像是填空題,你只能在括號里面填寫內(nèi)容,并且這句話是預(yù)知的,如果這句話的意思都變了,那么就出現(xiàn)異常了,當(dāng)然這樣的理解不準(zhǔn)確
獲取姓名是()并且狀態(tài)為()的用戶,
如果是sql注入,那么就變成,
獲取姓名是()或者所有用戶
顯然,這和我們預(yù)先設(shè)定的意思是不一樣的
php連接池 方式一:程序使用持久連接(PDO::ATTR_PERSISTENT)訪問數(shù)據(jù)庫,則一個PHP-FPM工作進(jìn)程對應(yīng)一個到MySQL的長連接.
請求結(jié)束后,PHP不會釋放到MySQL的連接,以便下次重用,這個過程對程序是透明的.
這可以看作是PHP-FPM維護(hù)的"數(shù)據(jù)庫連接池".
假如你的服務(wù)器有12個核心(超線程),你開啟24個PHP-FPM工作進(jìn)程.需要注意的是,PHP-FPM的進(jìn)程數(shù)pm.max_children不要多于MySQL的最大連接數(shù)max_connections(默認(rèn)151)"127.0.0.1", "db_username" => "root", "db_password" => "", "db_name" => "mybase", "db_port" => 3306, "db_pconnect" => true ); $dsn = "mysql:dbname=$app[db_name];host=$app[db_host];port=$app[db_port];charset=utf8"; $db = new PDO($dsn, $app["db_username"], $app["db_password"], array( PDO::ATTR_PERSISTENT => $app["db_pconnect"], PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ));方式二:可以使用swoole擴(kuò)展來實(shí)現(xiàn)。具體參考: 基于swoole擴(kuò)展實(shí)現(xiàn)真正的PHP數(shù)據(jù)庫連接池
方式三:PDO加上ODBC參考文檔:參數(shù)化查詢?yōu)槭裁茨軌蚍乐筍QL注入
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21734.html
摘要:參考中如何防止注入?yún)?shù)化查詢?yōu)槭裁茨軌蚍乐棺⑷肷厦嫣峁┑馁Y料比較多,下面根據(jù)自己的理解整理出來。使用的預(yù)處理參數(shù)化查詢可以有效防止注入。我們在上面預(yù)處理參數(shù)化查詢是在中進(jìn)行防注入操作的,其實(shí)也內(nèi)置了一個預(yù)處理的模擬器,叫做。 由于segmentfault在處理特殊字符時也并非完美,所以下面文章中有些符號被轉(zhuǎn)換了,請到本人博客下載原文txt http://www.yunxi365.cn/...
摘要:預(yù)處理語句和參數(shù)分別發(fā)送到數(shù)據(jù)庫服務(wù)器進(jìn)行解析,參數(shù)將會被當(dāng)作普通字符處理。解析當(dāng)你將語句發(fā)送給數(shù)據(jù)庫服務(wù)器進(jìn)行預(yù)處理和解析時發(fā)生了什么通過指定占位符一個或者一個上面例子中命名的,告訴數(shù)據(jù)庫引擎你想在哪里進(jìn)行過濾。 問題描述: 如果用戶輸入的數(shù)據(jù)在未經(jīng)處理的情況下插入到一條SQL查詢語句,那么應(yīng)用將很可能遭受到SQL注入攻擊,正如下面的例子: $unsafe_variable = $_...
閱讀 859·2019-08-30 15:54
閱讀 3325·2019-08-29 15:33
閱讀 2709·2019-08-29 13:48
閱讀 1235·2019-08-26 18:26
閱讀 3342·2019-08-26 13:55
閱讀 1499·2019-08-26 10:45
閱讀 1176·2019-08-26 10:19
閱讀 317·2019-08-26 10:16