$_GET 是 PHP 接收 HTTP GET 請求查詢字串參數的超全域陣列。它適用於資料檢索、分頁、搜尋、分享連結等冪等、無副作用的操作。理解其特性、限制與安全風險至關重要。
?key1=val1&key2=val2$_GET 總資料量受限<form action="search.php" method="get">
<label>關鍵字: <input type="search" name="q" placeholder="搜尋..."></label>
<label>分類:
<select name="category">
<option value="">全部</option>
<option value="tech">科技</option>
<option value="life">生活</option>
</select>
</label>
<button type="submit">搜尋</button>
</form>
https://example.com/search.php?q=php+array&category=tech
<?php
// search.php
$keyword = $_GET['q'] ?? '';
$category = $_GET['category'] ?? 'all';
// 驗證與過濾
$keyword = trim($keyword);
$keyword = htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8'); // 輸出時編碼
// 執行搜尋邏輯...
echo "搜尋關鍵字:$keyword,分類:$category";
?>
無需表單,超連結即可傳遞 $_GET 參數:
<a href="product.php?id=123&category=electronics">查看產品</a>
<a href="article.php?slug=php-guide&page=2">下一頁</a>
<?php
// product.php
$id = (int)($_GET['id'] ?? 0);
$category = $_GET['category'] ?? '';
if ($id > 0) {
// 取得產品資訊...
}
?>
攻擊者構造惡意連結:
https://example.com/search.php?q=
若直接輸出 $_GET['q'] 將執行腳本。
防護: 輸出時 必須 使用 htmlspecialchars()。
<?php
echo "搜尋:" . htmlspecialchars($_GET['q'] ?? '', ENT_QUOTES, 'UTF-8');
參數直接拼接 SQL:
<?php
// 危險!
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];
// 攻擊:?id=1 OR 1=1
防護: 使用預處理語句。
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id'] ?? 0]);
<?php
// 危險:重導向至任意網址
header("Location: " . $_GET['url']);
// 攻擊:?url=https://evil.com/phishing
防護: 白名單驗證、相對路徑檢查、中介確認頁。
?action=delete&id=1&action=view
// $_GET['action'] 可能為 'view'(最後值)或陣列(視 PHP 版本/設定)
防護: 嚴格驗證參數值、使用白名單。
絕不可 透過 GET 傳遞:密碼、Token、API Key、個資、信用卡號等。這些會記錄於瀏覽器歷史、伺服器存取日誌、Proxy 日誌、Referer Header 中。
| 適用 (GET) | 不適用 (應用 POST) |
|---|---|
| 搜尋、篩選、排序 | 登入、註冊、修改密碼 |
| 分頁導航 | 新增/編輯/刪除資料 |
| 文章/產品詳情頁 | 上傳檔案 |
| 分享連結、書籤 | 付款、下單 |
| RSS/JSON API 唯讀端點 | 任何修改伺服器狀態操作 |
| 多語言切換 ?lang=zh-TW | 敏感資訊傳遞 |
<a href="filter.php?colors[]=red&colors[]=blue&sizes[]=M">篩選</a>
<?php
$colors = $_GET['colors'] ?? []; // ['red', 'blue']
$sizes = $_GET['sizes'] ?? []; // ['M']
?>
<?php
$params = [
'q' => 'php tutorial',
'page' => 2,
'tags' => ['beginner', 'array'],
'sort' => 'date'
];
$url = 'search.php?' . http_build_query($params);
// search.php?q=php+tutorial&page=2&tags%5B0%5D=beginner&tags%5B1%5D=array&sort=date
<?php
function modifyQuery(array $changes, array $remove = []): string {
$params = $_GET;
foreach ($remove as $key) unset($params[$key]);
foreach ($changes as $key => $value) {
if ($value === null) unset($params[$key]);
else $params[$key] = $value;
}
return '?' . http_build_query($params);
}
// 用法:分頁連結保留搜尋條件
echo '<a href="' . modifyQuery(['page' => $nextPage]) . '">下一頁</a>';
echo '<a href="' . modifyQuery([], ['page']) . '">清除分頁</a>';
<?php
function getInt(string $key, int $default = 0, int $min = PHP_INT_MIN, int $max = PHP_INT_MAX): int {
$val = $_GET[$key] ?? $default;
$val = filter_var($val, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]]);
return $val !== false ? $val : $default;
}
function getString(string $key, string $default = '', int $maxLen = 255): string {
$val = $_GET[$key] ?? $default;
$val = mb_substr(trim($val), 0, $maxLen);
return $val;
}
$page = getInt('page', 1, 1);
$keyword = getString('q', '', 100);
<?php
// 開發環境
echo '<pre>';
var_dump($_GET);
echo '</pre>';
// 產生當前 URL 含查詢字串
$currentUrl = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
htmlspecialchars()in_array($category, ['all','tech','life'])http_build_query() 重建 URLCache-Control、ETag$_GET 讓網頁具備可分享、可書籤、可快取的特性,是 Web 資訊架構核心。善用其優勢、嚴守安全原則,能打造優質的瀏覽體驗。