PHP 靈活但易誤用。以下 10 種高發錯誤多涉及安全,逐項拆解修正方案。
用戶輸入直接 echo $_GET['username'],攻擊者可注入 <script>...。
修正: echo htmlspecialchars($_GET['username'], ENT_QUOTES);
依賴 magic_quotes_gpc (已移除) 或未過濾所有來源 (含 Cookie、Header)。
修正: 統一使用 預處理語句 (mysqli/PDO) 或 mysqli_real_escape_string()。
header()、session_start()、setcookie() 必須在**任何輸出前**調用。output_buffering 設定不一致導致開發環境正常、上線失敗。
修正: 代碼開頭調用 Header 函式,關閉 output_buffering 開發測試。
include($_GET['filename']) 導致任意檔案讀取/遠端代碼執行 (RFU)。
修正: 白名單驗證:if (in_array($_GET['file'], $allowed)) include($_GET['file']);
最常見低級錯誤。
修正: 用支援語法高亮、即時檢查的 IDE (PhpStorm/VS Code),嚴禁記事本寫代碼。
面向過程代碼難維護、難擴展、難測試。
修正: 掌握封裝、繼承、多型、SOLID,引入成熟框架 (Laravel/Symfony) 學習最佳實務。
95% 專案做 CRUD,重複造輪子。
修正: 採用 MVC 框架 (Laravel/CodeIgniter/Yii) 專注業務邏輯。
如 exec() 執行指令、escapeshellcmd() 安全過濾,許多開發者不知情。
修正: 寫代碼前查 php.net 手冊、Google 搜尋現成函式。
效能低、安全漏洞多、無現代語法 (標量型別、返回型別、匿名類等)。
修正: 升級至 PHP 8.1+,兼容性調整成本低,收益巨大。
開發環境 magic_quotes=Off 手動 addslashes(),上線環境 On 自動再轉一次,輸出 It\'s。
修正: 統一關閉 magic_quotes,手動控制;或檢測 get_magic_quotes_gpc() 動態處理 (PHP 5.4+ 已移除此功能)。
養成**安全第一、查閱手冊、用框架、升級版本**習慣,可避開 90% 坑。