PHP 是最流行的 Web 開發語言,但也因普及度高而成為駭客主要攻擊目標。以下五大守則能有效降低風險。
開發階段務必開啟完整錯誤回報,上線前關閉:
// 開發環境
error_reporting(E_ALL);
ini_set('display_errors', '1');
// 正式環境
error_reporting(0);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');
錯誤訊息是除錯與發現漏洞的最佳工具,切勿忽略。
以下設定在 PHP 5.4+ 已移除,舊版務必關閉:
register_globals = Off — 防止變數注入magic_quotes_gpc = Off — 避免重複轉義造成資料汙染magic_quotes_runtime = Offmagic_quotes_sybase = Off可在 php.ini 或 .htaccess 設定:
php_flag register_globals 0
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0
永遠不信任任何外部輸入($_GET、$_POST、$_COOKIE、$_SERVER)。使用白名單驗證:
// 只允許英數字與底線
$username = preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username']) ? $_POST['username'] : '';
輸出到 HTML 時必須編碼:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
若需允許有限 HTML,使用 HTML Purifier 白名單過濾。
使用預處理語句:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute([':username' => $username]);
$user = $stmt->fetch();
若必須拼接 SQL,務必使用 mysqli_real_escape_string() 或 PDO::quote()。
安全非一次性工作,而是持續的程序:程式碼審查、依賴更新、滲透測試、日誌監控。將上述守則內化為團隊開發規範,才能真正降低風險。