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

PHP 輸入過濾與 XSS/SQLi 防護:從基礎轉義到關鍵字過濾完整策略

     編輯:PHP 相關知識

雖然現代框架已內建防護,但理解核心原理仍不可或缺。本文涵蓋 htmlspecialchars、mysqli_real_escape_string/PDO 參數化、關鍵字黑名單過濾的優缺點與最佳實踐。

第一道防線:輸出端編碼 (防 XSS)

<?php
// 所有輸出到 HTML 內容、屬性、JS、CSS、URL 都需對應編碼
echo htmlspecialchars($userInput, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
// ENT_QUOTES 轉換單雙引號,ENT_SUBSTITUTE 替換無效碼點

// 屬性值
echo '';

// JavaScript 內容
echo ''; // json_encode 含編碼
?>

第二道防線:資料庫參數化查詢 (防 SQLi)

<?php
// PDO 參數化 (推薦)
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$stmt->execute([$email, 1]);

// mysqli 參數化
$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();

// ❌ 永遠不要手動拼接
// $sql = "SELECT * FROM users WHERE email = '$email'"; // 高風險
?>

第三道防線:輸入端過濾 (輔助,非核心)

注意:過濾/清洗輸入無法替代輸出編碼與參數化,僅作為深層防禦。

<?php
// 移除控制字元、正規化空白
function clean_input(string $str): string {
    $str = trim($str);
    $str = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $str); // 非列印字元
    $str = preg_replace('/\s+/u', ' ', $str); // 多重空白合併
    return $str;
}

// 關鍵字黑名單 (示範用,實務效果有限)
$blacklist = ['select','union','insert','update','delete','drop','alter','script','onload','onerror'];
function contains_blacklist(string $str, array $list): bool {
    $str = strtolower($str);
    foreach ($list as $word) {
        if (str_contains($str, $word)) return true;
    }
    return false;
}
?>

關鍵字過濾的缺陷

  • 誤殺:正常內容含 "select" (如 "selection") 會被攔截。
  • 繞過:大小寫混合、編碼、註解 /**/、字串拼接皆可繞過簡單 str_replace。
  • 維護成本:需持續更新清單,且無法防禦新型攻擊向量。

現代最佳實踐總結

  1. 資料庫:全域強制參數化查詢 (PDO/mysqli),拒絕拼接 SQL。
  2. 輸出:模板引擎自動逃逸 (Twig, Blade, Latte) 或統一 htmlspecialchars 包裝函式。
  3. CSP 標頭:Content-Security-Policy: default-src 'self'; script-src 'self' 徹底封殺內聯腳本。
  4. 輸入驗證:用 filter_var、Respect\Validation 等白名單驗證格式 (Email, URL, 數字範圍)。
  5. 檔案上傳:驗證 MIME、副檔名、重新命名、存放非公開目錄、Nginx/Apache 禁用執行權限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved