PHP 應用安全非單一修補,需從文件系統、資料庫、用戶輸入、運行環境四個維度建立纵深防禦。本文系統梳理核心風險與對應策略,附代碼反面教材與最佳實踐清單。
<?php
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
unlink("$homedir/$userfile"); // 若 $userfile = '../etc/passwd' 將刪除系統文件
echo "The file has been deleted!";
..、/、\、: 等路徑特徵字符的輸入。realpath() 解析絕對路徑,確認在允許目錄樹內再操作。$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $input]);
參數綁定徹底隔離代碼與數據,根除注入。password_hash()(bcrypt/argon2),身份證、銀行卡等採用 AES-256-GCM 加密,金鑰由 KMS 管理。// 用戶名僅允許字母數字
if (!ctype_alnum($_POST['username'])) die('Invalid username');
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')json_encode() 直接輸出安全 JS 字面量rawurlencode(),拒絕 javascript: 協議token(hash_hmac('sha256', session_id, secret))Referer / Origin 標頭| 配置項 | 建議值 | 說明 |
|---|---|---|
| display_errors | Off | 生產環境不向用戶暴露堆疊 |
| error_reporting | E_ALL | 記錄所有級別錯誤至日誌 |
| error_log | /var/log/php/error.log | 集中收集,便於審計與告警 |
| register_globals | Off | PHP 5.4+ 已移除,舊版必須關閉 |
| magic_quotes_gpc | Off | PHP 5.4+ 已移除,勿依賴 |
| expose_php | Off | 隱藏 PHP 版本資訊 |
composer update --dry-run 檢查安全公告。[ ] 文件操作:權限最小化、路徑白名單、UUID 命名
[ ] 資料庫:專用帳號、PDO 預處理、敏感字段加密
[ ] 輸入:白名單驗證、長度限制、型別轉換
[ ] 輸出:上下文編碼、CSP 標頭、HttpOnly Cookie
[ ] CSRF:Token 驗證、SameSite Cookie、雙重提交
[ ] 環境:錯誤不顯示、日誌完整、危險特性關閉
[ ] 版本:PHP 與依賴保持最新安全版本
安全是系統工程,而非單點修補。將上述策略內化為團隊開發規範,配合代碼審查與自動化掃描(如 Psalm、PHPStan、RIPS),才能構建經得起實戰考驗的 PHP 應用。