首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 入門

PHP $_GET 超全域變數完整指南:查詢字串接收、安全風險與應用場景

     編輯:PHP 入門

PHP $_GET 超全域變數完整指南

$_GET 是 PHP 接收 HTTP GET 請求查詢字串參數的超全域陣列。它適用於資料檢索、分頁、搜尋、分享連結等冪等、無副作用的操作。理解其特性、限制與安全風險至關重要。

基本特性

  • 資料來源:URL 查詢字串 ?key1=val1&key2=val2
  • 可見性:完整顯示於瀏覽器網址列,可被書籤、分享、記錄於伺服器日誌
  • 資料結構:關聯陣列,鍵名對應查詢參數名
  • 長度限制:URL 總長度約 2000 字元(瀏覽器/伺服器限制),$_GET 總資料量受限
  • 快取友善:GET 請求可被瀏覽器、Proxy、CDN 快取
  • 冪等性:同一請求多次執行結果相同,不應修改伺服器狀態

基本範例

HTML 表單 (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>

產生的 URL

https://example.com/search.php?q=php+array&category=tech

PHP 接收

<?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) {
    // 取得產品資訊...
}
?>

安全風險與防護

1. XSS(跨站腳本攻擊)

攻擊者構造惡意連結:

https://example.com/search.php?q=

若直接輸出 $_GET['q'] 將執行腳本。

防護: 輸出時 必須 使用 htmlspecialchars()。

<?php
echo "搜尋:" . htmlspecialchars($_GET['q'] ?? '', ENT_QUOTES, 'UTF-8');

2. SQL Injection

參數直接拼接 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]);

3. 開放導向 / SSRF

<?php
// 危險:重導向至任意網址
header("Location: " . $_GET['url']);
// 攻擊:?url=https://evil.com/phishing

防護: 白名單驗證、相對路徑檢查、中介確認頁。

4. 參數污染 / 邏輯繞過

?action=delete&id=1&action=view
// $_GET['action'] 可能為 'view'(最後值)或陣列(視 PHP 版本/設定)

防護: 嚴格驗證參數值、使用白名單。

5. 敏感資訊洩露

絕不可 透過 GET 傳遞:密碼、Token、API Key、個資、信用卡號等。這些會記錄於瀏覽器歷史、伺服器存取日誌、Proxy 日誌、Referer Header 中。

適用場景 vs 不適用場景

適用 (GET)不適用 (應用 POST)
搜尋、篩選、排序登入、註冊、修改密碼
分頁導航新增/編輯/刪除資料
文章/產品詳情頁上傳檔案
分享連結、書籤付款、下單
RSS/JSON API 唯讀端點任何修改伺服器狀態操作
多語言切換 ?lang=zh-TW敏感資訊傳遞

進階應用技巧

1. 陣列參數

<a href="filter.php?colors[]=red&colors[]=blue&sizes[]=M">篩選</a>

<?php
$colors = $_GET['colors'] ?? []; // ['red', 'blue']
$sizes = $_GET['sizes'] ?? [];   // ['M']
?>

2. 建構查詢字串:http_build_query()

<?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

3. 保留現有參數新增/修改

<?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>';

4. 類型轉換與驗證輔助函數

<?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'];

最佳實踐總結

  1. 唯讀操作用 GET,狀態變更用 POST
  2. 敏感資料絕不放 URL
  3. 輸出必編碼:htmlspecialchars()
  4. 資料庫用預處理:PDO prepare
  5. 參數白名單驗證:in_array($category, ['all','tech','life'])
  6. 分頁/篩選保留參數:http_build_query() 重建 URL
  7. 長度控制:避免超過 2000 字元限制
  8. 快取策略:合理設定 Cache-Control、ETag

$_GET 讓網頁具備可分享、可書籤、可快取的特性,是 Web 資訊架構核心。善用其優勢、嚴守安全原則,能打造優質的瀏覽體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved