[PDO]使用 PDO 防止 SQL 注入攻擊

Kunyu
3 min readApr 7, 2023

--

PDO (PHP Data Objects) 是 PHP 一個流行的資料庫操作介面,它提供了一種更加安全和方便的方法來操作資料庫,其中一個主要的優點就是可以有效地防止 SQL 注入攻擊。

以下是兩種常用的 PDO 防止 SQL 注入的方法:

(1) PDO::quote()

PDO::quote() 方法可以將字串中的特殊字元轉換為字串表示方式,從而防止 SQL 注入攻擊。該方法會自動識別資料庫的字元集,並適當地處理單引號、雙引號和反斜線等特殊字元。

使用 PDO::quote() 方法時,必須先建立 PDO 連接,然後使用該連接的 quote() 方法。例如:

$dbh = new PDO('mysql:host=localhost;dbname=mydatabase', $user, $pass);
$username = PDO::quote($_POST['username']);
$password = PDO::quote($_POST['password']);
$sql = "SELECT * FROM users WHERE username = $username AND password = $password";
$result = $dbh->query($sql);

(2) Prepared statements

另一個常用的 PDO 防止 SQL 注入的方法是使用 Prepared statements。Prepared statements 會將 SQL 查詢和參數分開處理,從而防止參數中包含的特殊字元被誤解為 SQL 語句的一部分。

使用 Prepared statements 需要使用 PDO::prepare() 方法來準備 SQL 查詢,然後使用 PDOStatement::execute() 方法來執行該查詢。例如:

$dbh = new PDO('mysql:host=localhost;dbname=mydatabase', $user, $pass);
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $dbh->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();
$result = $stmt->fetchAll();

兩種方法都可以有效地防止 SQL 注入攻擊,但是 Prepared statements 的方法更被推薦。因為 Prepared statements 不僅可以防止 SQL 注入攻擊,還可以提高查詢的效率,特別是當需要多次執行相同的查詢時,使用 Prepared statements 可以避免重複的編譯和優化,提高查詢性能。

而 PDO::quote() 方法只是一個單純的字串處理函數,需要先建立 PDO 連接,然後使用該連接的 quote() 方法。相比之下,使用 Prepared statements 需要一些額外的程式設計,但是也更加靈活和高效。因此,在實際應用中,我們通常會優先考慮 Prepared statements 的方法來防止 SQL 注入攻擊。

--

--

Kunyu
Kunyu

Written by Kunyu

軟體工程師,Web系統開發為主。

No responses yet