成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php pdo防sql注入原理 php連接池

skinner / 1937人閱讀

摘要:具體參考基于擴(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

相關(guān)文章

  • php操作mysqlsql注入(合集)

    摘要:參考中如何防止注入?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/...

    kviccn 評論0 收藏0
  • PHP中該怎樣SQL注入?

    摘要:預(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 = $_...

    Panda 評論0 收藏0

發(fā)表評論

0條評論

skinner

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<