安全不是功能,是架構層面的基因。本文闡述三大核心原則在 PHP 開發中的具體落地實踐。
「任何單一防線都會失效,必須有備用方案在失效時仍能提供保護。」
| 業務場景 | 第一防線 | 第二防線(備用) |
|---|---|---|
| 用戶修改敏感信息 | 登錄態驗證 | 二次密碼驗證/短信驗證碼 |
| 文件上傳 | 副檔名/MIME檢查 | 存儲路徑非Web可訪問 + 重命名 + 內容掃描 |
| SQL查詢 | 參數化查詢 | WAF攔截 + 數據庫最小權限賬號 |
| 跨站腳本(XSS) | 輸出編碼 | CSP策略 + HttpOnly Cookie |
警示:過度防禦增加複雜度與成本,需風險評估後分級部署。
「只授予完成任務所必需的最小權限集,而非『排除不需要的權限』。」
<?php
// 壞例:數據庫連接使用 root 賬號
$pdo = new PDO('mysql:host=localhost;dbname=app', 'root', 'root123');
// 壞例:上傳目錄賦予 777 權限
chmod('/var/www/uploads', 0777);
SELECT/INSERT/UPDATE/DELETE,DDL 權限歸遷移腳本專用賬號750(擁有者寫、組讀、其他無),Web 進程加入組;腳本目錄 550 僅讀執行「複雜滋生錯誤,錯誤導致漏洞。沒有必要的複雜等同於沒有必要的風險。」
<?php
// 複雜易混淆版(三元運算符掩蓋污染源)
$search = isset($_GET['search']) ? $_GET['search'] : '';
// 等價但清晰版
$search = '';
if (isset($_GET['search'])) {
$search = $_GET['search'];
}
// 最佳實踐:顯式標記來源
$search = $_GET['search'] ?? ''; // PHP 7+ null合併運算符
// 後續處理時清晰知道:$search 來自用戶輸入,需過濾/轉義
將這三大原則內化為肌肉記憶,安全才能真正融入開發 DNA,而非事後補丁。