安全非單一技術,而是貫穿開發週期的習慣。本文整理七大核心安全習慣,涵蓋輸入驗證、檔案系統、資料庫、Session、XSS、CSRF、表單驗證,並提供具體防護程式碼模式。
原則:永遠不信任用戶輸入。採用「白名單」而非「黑名單」驗證。
// 錯誤:嘗試過濾惡意字元(黑名單)
$name = str_replace(['<', '>', '"'], '', $_POST['name']);
// 正確:定義允許的格式(白名單)
if (!preg_match('/^[a-zA-Z0-9_\-\s]{1,50}$/', $_POST['username'])) {
throw new InvalidArgumentException('帳號格式錯誤');
}
// 內建過濾器
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$intId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['min_range' => 1]);
include $_GET['page'] → 極度危險。basename()、realpath() 限制在允許目錄內。// 安全包含檔案
$page = basename($_GET['page'] ?? 'home');
$allowed = ['home', 'about', 'contact'];
if (in_array($page, $allowed)) {
include "pages/{$page}.php";
}
唯一正解:預處理語句。
// PDO 範例
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = 1');
$stmt->execute([':email' => $_POST['email']]);
$user = $stmt->fetch();
// 禁止拼接字串
// $sql = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'"; // 錯誤!
session.cookie_httponly = 1 防 JavaScript 竊取。session.cookie_secure = 1 僅 HTTPS 傳輸。session.use_strict_mode = 1 拒絕未初始化的 Session ID。session_regenerate_id(true) 防 Session Fixation。輸出時轉義,而非輸入時過濾。
// HTML 內容
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// HTML 屬性
echo '';
// JavaScript 內容
echo '';
// 使用模板引擎自動轉義(Twig, Blade, Latte)
// 產生 Token
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 表單隱藏欄位
echo '';
// 驗證
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
die('CSRF token 驗證失敗');
}
// 處理業務邏輯
}
同上習慣六,重點在於:
random_bytes())、綁定 Session、一次性或短時效。session.cookie_samesite = 'Strict' 或 'Lax' 作為第二道防線。| 習慣 | 關鍵動作 | 工具/設定 |
|---|---|---|
| 輸入驗證 | 白名單、filter_var、型別檢查 | PHP Filter, Respect\Validation |
| 檔案系統 | 路徑正規化、上傳隔離 | basename, realpath, move_uploaded_file |
| 資料庫 | 預處理語句、最小權限帳號 | PDO, mysqli |
| Session | HttpOnly, Secure, StrictMode, 再生 ID | php.ini, session_set_save_handler |
| XSS | 輸出轉義、CSP 標頭 | htmlspecialchars, json_encode, Twig/Blade |
| 表單驗證 | CSRF Token、SameSite Cookie | random_bytes, hash_equals |
| CSRF | 同源檢查、雙重提交 Cookie | SameSite, CSRF Token |
安全是系統工程,非單點修補。將這七大習慣內化為團隊開發文化,並持續跟進 CVE、OWASP Top 10、PHP 版本安全公告。