首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 防 SQL 注入實作指南:從 addslashes 到 PDO 預處理語句

     編輯:PHP 相關知識

PHP 防 SQL 注入實作指南:從 addslashes 到 PDO 預處理語句

SQL 注入是 Web 應用最常見的高風險漏洞。早期 PHP 開發者常用 addslashes() 或 mysql_real_escape_string() 轉義輸入,但現代開發強烈建議改用 PDO 預處理語句,從根本上分離 SQL 邏輯與資料,徹底杜絕注入風險。

舊式做法回顧(僅供理解歷史代碼)

缺點: 魔術引號已棄用、手動轉義易漏、字元集問題、無法防禦所有注入向量。

現代最佳實踐:PDO 預處理語句

 PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false, // 使用真正的預處理
]);

// 參數綁定範例
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = :status');
$stmt->execute(['email' => $email, 'status' => 1]);
$user = $stmt->fetch();

// 批次插入範例
$pdo->beginTransaction();
$stmt = $pdo->prepare('INSERT INTO logs (message, created_at) VALUES (:msg, NOW())');
foreach ($messages as $msg) {
    $stmt->execute(['msg' => $msg]);
}
$pdo->commit();
?>

進階:建立通用查詢建構器(可選)

若專案需大量動態查詢,可封裝簡單的 Query Builder,核心原則仍是所有動態值皆走參數綁定:

pdo = $pdo; }

    public function select(string $table, array $where = [], array $columns = ['*']): array {
        $sql = 'SELECT ' . implode(', ', $columns) . ' FROM ' . $table;
        $params = [];
        if ($where) {
            $conditions = [];
            foreach ($where as $col => $val) {
                $param = ':' . $col;
                $conditions[] = "`$col` = $param";
                $params[$param] = $val;
            }
            $sql .= ' WHERE ' . implode(' AND ', $conditions);
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }
}
?>

補充防護層

  • 最小權限原則: 資料庫帳號僅授予必要權限(SELECT/INSERT/UPDATE),避免 DROP、GRANT 等高危操作。
  • 錯誤訊息不外露: 生產環境關閉 display_errors,記錄至日誌檔。
  • 輸入驗證: 型別檢查、長度限制、格式正則(Email、手機號等)。
  • WAF / 資料庫防火牆: 如 ModSecurity、Cloudflare WAF、MySQL Enterprise Firewall。

快速對照表

get_magic_quotes_gpc 相關
方法推薦度適用場景
PDO 預處理語句⭐⭐⭐⭐⭐所有新專案、所有動態查詢
mysqli 預處理語句⭐⭐⭐⭐僅用 mysqli 專案
addslashes / 手動轉義⭐維護舊代碼、極簡腳本(不建議)
❌ 已移除PHP 5.4+ 已棄用,PHP 7.0+ 移除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved