核心超全域變數對照
| 變數 | 來源 | 可見性 | 長度限制 | 適用場景 |
$_GET | URL 查詢字串 | 瀏覽器網址列可見 | ~2000 字元 (瀏覽器限制) | 搜尋、分頁、非敏感資料、可書籤 |
$_POST | HTTP Body | 不可見 | 無 (受 post_max_size) | 登入、註冊、修改資料、檔案上傳 |
$_REQUEST | GET+POST+COOKIE | 混合 | 同上 | 快速原型、不建議生產環境 |
表單 HTML 範本
<form action="handle.php" method="post">
姓名:<input type="text" name="name" required>
年齡:<input type="number" name="age" min="1" max="120">
<button type="submit">送出</button>
</form>
後端處理範例
120) $errors[] = '年齡範圍 1-120';
// 3. 回應
if ($errors) {
// 重導回表單攜帶錯誤 (PRG 模式)
$_SESSION['form_errors'] = $errors;
$_SESSION['form_old'] = $_POST;
header('Location: form.php');
exit;
}
// 成功邏輯
echo "歡迎,$name (${age} 歲)";
}
?>
版本相容性:register_globals 已移除
PHP 5.4+ 完全移除 register_globals,舊代碼 $username 直接可用將失效。務必使用 $_POST['username']。
import_request_variables() 替代方案
// 僅供遷移舊專案過渡使用,新專案請勿使用
import_request_variables('gp', 'rvar_');
// 之後可用 $rvar_username
// 建議:直接重構為 $_POST['username']
安全驗證三層防線
- 前端 (JS/HTML5): required、pattern、type=email、即時提示,降低無效請求
- 後端 (PHP): 必須驗證、過濾、轉義,永不信任客戶端
- 資料庫: Prepared Statement 參數綁定,防 SQL 注入
常見漏洞與防護
| 漏洞 | 攻擊向量 | 防護 |
| XSS | <script>alert(1)</script> 送入姓名 | 輸出時 htmlspecialchars() |
| CSRF | 偽造表單提交 | 表單隱藏 csrf_token,驗證來源 |
| SQLi | ' OR 1=1 -- 送入查詢 | PDO prepare + bindParam |
| 檔案上傳 | 上傳 .php 偽裝圖片 | 驗證 MIME、重命名、存非執行目錄 |
相關專題
- 《PHP 基本語法入門教程》
- 《PHP 字串(string)用法總結》