優良的 PHP 程式碼不只是「能跑」,更要具備安全性、結構化、規範化與自適應四大特質。本文透過三個版本的演進,展示如何從「能用」走向「專業」。
<?php
// 直接輸出使用者輸入,極度危險
echo "Search results for query: " . $_GET['query'] . "."; ?>
問題:
<?php
// 僅做輸出轉義
echo "Search results for query: " . htmlspecialchars($_GET['query']) . "."; ?>
改進: 防禦 XSS(`htmlspecialchars` 轉義 HTML 實體)
遺留問題:
<?php
// 1. 輸入驗證
if (isset($_GET['query'])) {
// 2. 安全輸出:指定編碼 UTF-8、轉義雙引號 ENT_QUOTES
echo 'Search results for query: '
. htmlspecialchars($_GET['query'], ENT_QUOTES, 'UTF-8')
. '.';
}
亮點:
| 威脅 | 防禦措施 | PHP 函式/工具 |
|---|---|---|
| XSS | 輸出轉義、CSP 標頭 | htmlspecialchars(), htmlentities(), 模板引擎自動轉義 |
| SQL Injection | 參數化查詢、ORM | PDO Prepared Statements, Eloquent, Doctrine |
| CSRF | Token 驗證、SameSite Cookie | hash_hmac(), 框架內建 CSRF 保護 |
| 檔案上傳 | 型別驗證、重命名、存放非公開目錄 | mime_content_type(), getimagesize(), Flysystem |
| 敏感資料洩露 | 錯誤頁面不顯示堆疊、日誌脫敏 | display_errors=Off, Monolog 處理器 |
# composer.json 關鍵依賴
{
"require": {
"php": "^8.2",
"ext-pdo": "*",
"vlucas/phpdotenv": "^5.5",
"monolog/monolog": "^3.4"
},
"require-dev": {
"phpstan/phpstan": "^1.10",
"psalm/plugin-phpunit": "^1.0",
"rector/rector": "^1.0",
"phpunit/phpunit": "^10.5",
"friendsofphp/php-cs-fixer": "^3.40"
},
"scripts": {
"analyse": ["phpstan analyse", "psalm"],
"fix": ["rector process", "php-cs-fixer fix"],
"test": "phpunit"
}
}
從「能跑」到「專業」,關鍵在於:
這四大支柱相輔相成,缺一不可。投資程式碼品質,就是投資專案的長期存活率與團隊開發效率。