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

PHP 防 SQL 注入完全指南:mysql_real_escape_string 與現代最佳實踐

     編輯:PHP 相關知識

SQL 注入攻擊原理演示

當用戶輸入直接拼接進 SQL 語句時,惡意輸入可改變查詢邏輯:

舊時代方案:mysql_real_escape_string()

⚠ 警告: mysql_* 系列函數已在 PHP 7.0 移除,僅供歷史代碼維護參考。

函數說明

string mysql_real_escape_string(string $string, resource $connection = null)

轉義特殊字符:\x00 \n \r \ ' " \x1a

使用範例

封裝安全輸入函數(舊版寫法)

現代最佳實踐:PDO 預處理語句(推薦)

核心優勢: SQL 邏輯與數據分離,從根源杜絕注入,支援多種數據庫。

PDO 連接配置

 PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false, // 使用真實預處理
];
$pdo = new PDO($dsn, 'username', 'password', $options);

參數綁定查詢

prepare("SELECT * FROM users WHERE user = :user AND password = :pwd");
$stmt->execute(['user' => $user, 'pwd' => $pwd]);
$result = $stmt->fetchAll();

// 問號佔位符
$stmt = $pdo->prepare("SELECT * FROM users WHERE user = ? AND password = ?");
$stmt->execute([$user, $pwd]);

插入/更新/刪除

prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => '張三', 'email' => 'zhangsan@example.com']);
$lastId = $pdo->lastInsertId();

// 更新
$stmt = $pdo->prepare("UPDATE users SET email = :email WHERE id = :id");
$stmt->execute(['email' => 'new@test.com', 'id' => 1]);

// 刪除
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute(['id' => 1]);

MySQLi 預處理(PDO 替代方案)

prepare("SELECT * FROM users WHERE user = ? AND password = ?");
$stmt->bind_param('ss', $user, $pwd); // 'ss' 表示兩個字符串參數
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // 處理結果
}
$stmt->close();

防禦深度策略

層級措施說明
1. 代碼層預處理語句根本解決,PDO/MySQLi
2. 數據庫層最小權限原則Web 用戶僅擁有必要增刪改查權限,無 DROP/ALTER 權限
3. 應用層輸入驗證與過濾白名單驗證、長度限制、類型檢查
4. 監控層WAF / 日誌審計異常 SQL 模式告警、慢查詢分析
5. 錯誤處理不暴露 SQL 細節生產環境關閉詳細錯誤輸出,記錄日誌而非顯示用戶

常見誤區澄清

❌ 錯誤: addslashes() 能防注入 → 無效,不處理多字節字符編碼問題

❌ 錯誤: 過濾關鍵字(select, union 等) → 繞過極易,影響正常業務

❌ 錯誤: 只有數字才用預處理 → 所有外部輸入 都應使用預處理

✅ 正確: 統一使用 PDO 預處理 + 參數綁定,無例外

遷移檢查清單

  1. 全項目搜索 mysql_query、mysql_real_escape_string
  2. 建立 PDO 連接單例/依賴注入容器
  3. 逐個替換為預處理語句
  4. 測試所有 CRUD 操作
  5. 啟用 SQL 日誌驗證執行語句
  6. 部署上線前進行滲透測試
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved