首頁 > 後端開發 > php教程 > PDO方式連接mysql可以防注入的原因

PDO方式連接mysql可以防注入的原因

不言
發布: 2023-03-25 12:26:02
原創
1793 人瀏覽過

  $stmt = $pdo->prepare('select * from user where id=?');
    $id = 1;
    $stmt->bindParam(1,$id);
    $stmt - >execute();
登入後複製

<span style="font-size:14px;" data-filtered="filtered"></span>
登入後複製

這種情況下,PHP只是簡單的將sql語句傳送給mysql  server,##這與我們平時使用mysql_real_escape_string將字串進行轉義,再拼接成SQL語句沒有差別(只是由PDO本地驅動完成轉義的),顯然這種情況下還是有可能造成SQL注入的,也就是說在php本地調用pdo prepare中的mysql_real_escape_string來操作query,使用的是本地單字節字元集,而我們傳遞多位元組編碼的變數時,有可能還是會造成SQL注入漏洞(php 5.3.6先前版本的問題之一,這也就解釋了為何在使用PDO時,建議升級到php 5.3.6 ,並在DSN字串中指定charset的原因。給mysql Server指定字元集,並將變數傳送給MySQL Server完成根據字元轉義。本地轉義而交由MySQL Server轉義呢? 。 #這次PHP是將SQL模板和變數是分兩次傳送給MySQL的,由MySQL完成變數的轉義處理,既然變數和SQL模板是分兩次發送的,那就不存在SQL注入的問題了,但需要在DSN中指定charset屬性,如:

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root');

#那麼,有個問題,如果在DSN中指定了charset, 是否還需要執行set names 呢? :

A.  告訴mysql server, 用戶端(PHP程式)提交給它的編碼是什麼

B.  告訴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 指令。

相關推薦:

ThinkPHP框架基於PDO方式連接資料庫操作範例

以上是PDO方式連接mysql可以防注入的原因的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板