摘要:具體參考基于擴展實現真正的數據庫連接池方式三加上參考文檔參數化查詢為什么能夠防止注入
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狀態:方式一、方式二都正常
訪問:
http://localhost/PdoTest.php?userName=tomener" or 1=1;-- http://localhost/PdoTest.php?userName=tomener%27%20or%201=1;--狀態:方式一返回false,方式二返回user表所有數據
問題來了,為什么pdo預處理能正確處理sql注入呢?mysql預處理語句,mysql支持預處理,sql已經預編譯好了,坑已經挖好了,來一個填一個,不會改變原本sql的意思,那么后面的or 1=1;--根本不會被mysql編譯成執行計劃,被當作普通的字符串處理,沒任何意義。
通俗的理解,就像是填空題,你只能在括號里面填寫內容,并且這句話是預知的,如果這句話的意思都變了,那么就出現異常了,當然這樣的理解不準確
獲取姓名是()并且狀態為()的用戶,
如果是sql注入,那么就變成,
獲取姓名是()或者所有用戶
顯然,這和我們預先設定的意思是不一樣的
php連接池 方式一:程序使用持久連接(PDO::ATTR_PERSISTENT)訪問數據庫,則一個PHP-FPM工作進程對應一個到MySQL的長連接.
請求結束后,PHP不會釋放到MySQL的連接,以便下次重用,這個過程對程序是透明的.
這可以看作是PHP-FPM維護的"數據庫連接池".
假如你的服務器有12個核心(超線程),你開啟24個PHP-FPM工作進程.需要注意的是,PHP-FPM的進程數pm.max_children不要多于MySQL的最大連接數max_connections(默認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擴展來實現。具體參考: 基于swoole擴展實現真正的PHP數據庫連接池
方式三:PDO加上ODBC參考文檔:參數化查詢為什么能夠防止SQL注入
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21734.html
摘要:參考中如何防止注入參數化查詢為什么能夠防止注入上面提供的資料比較多,下面根據自己的理解整理出來。使用的預處理參數化查詢可以有效防止注入。我們在上面預處理參數化查詢是在中進行防注入操作的,其實也內置了一個預處理的模擬器,叫做。 由于segmentfault在處理特殊字符時也并非完美,所以下面文章中有些符號被轉換了,請到本人博客下載原文txt http://www.yunxi365.cn/...
摘要:預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被當作普通字符處理。解析當你將語句發送給數據庫服務器進行預處理和解析時發生了什么通過指定占位符一個或者一個上面例子中命名的,告訴數據庫引擎你想在哪里進行過濾。 問題描述: 如果用戶輸入的數據在未經處理的情況下插入到一條SQL查詢語句,那么應用將很可能遭受到SQL注入攻擊,正如下面的例子: $unsafe_variable = $_...
閱讀 845·2019-08-30 15:54
閱讀 3316·2019-08-29 15:33
閱讀 2701·2019-08-29 13:48
閱讀 1213·2019-08-26 18:26
閱讀 3333·2019-08-26 13:55
閱讀 1476·2019-08-26 10:45
閱讀 1164·2019-08-26 10:19
閱讀 305·2019-08-26 10:16