MySQL PDO、JSON API 與 PHP 安全實務

當你開始連接資料庫與處理登入資料時,安全就變得非常重要。本頁將介紹 PDO、prepared statements、密碼雜湊與 XSS/SQL Injection 防護。

PDOMySQLSecurity

關鍵原則

資料庫查詢用預備語句,密碼不要明文儲存,輸出到 HTML 前要做安全轉義。

1. 建立 PDO 連線

PDO 支援多種資料庫驅動,語法一致,適合實務使用。

new PDO()ERRMODE_EXCEPTION
中階
PDO 連線
<?php
$pdo = new PDO(
  "mysql:host=localhost;dbname=test;charset=utf8mb4",
  "root",
  ""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

2. 預備語句防止 SQL Injection

絕對不要直接把使用者輸入字串拼接到 SQL 中。

prepareexecutebind
進階
安全查詢使用者
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([
  ":email" => "[email protected]"
]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($user);
?>

3. 密碼雜湊

使用 password_hash 與 password_verify 安全管理密碼。

password_hashpassword_verify
進階
密碼驗證
<?php
$password = "mySecret123";
$hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify("mySecret123", $hash)) {
  echo "登入成功";
}
?>

4. 輸出 JSON API

PHP 不只產生 HTML,也常被用來輸出 API 回應。

header()json_encode()
中階
JSON 回應
<?php
header("Content-Type: application/json; charset=utf-8");
$data = [
  "status" => "success",
  "message" => "資料取得成功",
  "items" => ["PHP", "MySQL", "Laravel"]
];
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>
做 API 時請搭配輸入驗證、權限驗證、錯誤碼與日誌紀錄。