PHP 是最流行的 Web 開發語言,但也因廣泛使用而成為攻擊目標。本文整理五大實務防護技巧,助你在上線前建立纏深防禦體系。
開發階段務必開啟完整錯誤回報,上線前關閉顯示但保留記錄:
<?php
// 開發環境
error_reporting(E_ALL);
ini_set('display_errors', '1');
// 正式環境
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');
錯誤日誌不僅是除錯工具,更能及早發現潛在安全漏洞(如 SQL 注入嘗試、路徑遍歷)。
以下設定在 PHP 5.4+ 已移除,舊版務必關閉:
?access=1 繞過驗證)。可在 php.ini 或 .htaccess 設定:
php_flag register_globals 0 php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0
filter_var()、ctype_*、正則表達式驗證。輸出到 HTML 時務必編碼:
<?php // 使用 htmlspecialchars,指定編碼與雙引號轉換 echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
HttpOnly 與 Secure Cookie 旗標,緩解 Cookie 竊取。唯一正解:參數化查詢(Prepared Statements)
<?php
// PDO 範例
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute([':username' => $_GET['username']]);
$user = $stmt->fetch();
舊版 mysqli 亦支援:
$stmt = $mysqli->prepare('SELECT * FROM users WHERE username = ?');
$stmt->bind_param('s', $_GET['username']);
$stmt->execute();
切勿使用 mysqli_real_escape_string 拼接 SQL,參數化查詢從根本分離代碼與資料。
單一防線終有失效時刻。結合:最小權限原則(資料庫帳號僅賦予必要權限)、輸入驗證、輸出編碼、參數化查詢、錯誤日誌監控、定期更新 PHP 與擴充套件,才能構建真正安全的 PHP 應用。