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

PHP 接收表單提交數據完整指南:$_GET、$_POST、$_REQUEST 詳解與安全實踐

     編輯:PHP 相關知識

表單提交是 Web 交互的基石。PHP 提供了三個超全局變數 $_GET、$_POST、$_REQUEST 來接收客戶端數據。本文系統梳理三者差異、使用場景、安全風險與最佳實踐,助你構建健壯的表單處理邏輯。

一、核心概念:HTTP 方法與 PHP 超全局變數對應

HTTP 方法PHP 超全局變數數據位置特點
GET$_GETURL 查詢字符串可見、可收藏、長度受限、非幂等操作不適用
POST$_POST請求體不可見、無長度限制、適合修改數據、上傳文件
GET/POST/COOKIE$_REQUEST三者合併便利但不安全、來源不明確、生產環境不推薦

二、$_GET:URL 參數接收

表單頁面

<!-- get_form.html -->
<form action="get_handler.php" method="get">
    用戶名:<input type="text" name="username" /><br/>
    <input type="submit" value="提交" />
</form>

處理頁面

<?php
// get_handler.php
// 1. 獲取數據(建議檢查是否存在)
$username = $_GET['username'] ?? '';

// 2. 安全輸出(防 XSS)
echo '您輸入的用戶名:' . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');

// 3. URL 實際樣貌:get_handler.php?username=Jacky
?>

適用場景

  • 搜尋、篩選、分頁等幂等操作(不修改服務端狀態)
  • 需生成可分享、可收藏的 URL
  • 數據量小、非敏感信息

三、$_POST:請求體數據接收

表單頁面

<!-- post_form.html -->
<form action="post_handler.php" method="post">
    用戶名:<input type="text" name="username" /><br/>
    密碼:<input type="password" name="password" /><br/>
    <input type="submit" value="登錄" />
</form>

處理頁面

<?php
// post_handler.php
// 1. 僅接受 POST 請求
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit('Method Not Allowed');
}

// 2. 獲取並過濾數據
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';

// 3. 驗證
if ($username === '' || $password === '') {
    exit('用戶名和密碼不能為空');
}

// 4. 業務邏輯(如驗證登錄、寫入資料庫)
// ...

echo '歡迎,' . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
?>

適用場景

  • 登錄、註冊、修改資料、刪除操作等非幂等操作
  • 敏感信息(密碼、身份證、銀行卡)
  • 大量數據、文件上傳(需 enctype="multipart/form-data")

四、$_REQUEST:合併獲取(慎用!)

<?php
// 同時獲取 GET/POST/COOKIE,優先順序受 variables_order 影響(預設 EGPCS)
$name = $_REQUEST['name'] ?? ''; // 來源不明確!

// 風險示例:
// 用戶訪問:page.php?name=attacker
// 表單 POST 提交:name=victim
// $_REQUEST['name'] 可能取到 'attacker'(GET 覆蓋 POST)或 'victim',取決於配置
?>

❌ 為什麼生產環境不推薦 $_REQUEST?

  1. 來源模糊:無法區分數據來自 URL、表單還是 Cookie,增加安全審計難度。
  2. 覆蓋風險:同名參數在不同來源中可能相互覆蓋,導致邏輯錯誤。
  3. CSRF 風險:攻擊者可構造 URL 覆蓋 POST 參數,繞過部分防護。
  4. 可讀性差:代碼意圖不明確,維護成本高。

五、表單元素數據獲取對照表

表單元素HTML 示例PHP 獲取方式返回值類型
文本框<input name="username">$_POST['username']字符串
密碼框<input type="password" name="pwd">$_POST['pwd']字符串
單選框<input type="radio" name="sex" value="1">$_POST['sex']字符串(選中的 value)
複選框(單個)<input type="checkbox" name="agree" value="1">isset($_POST['agree'])布爾/字符串
複選框(多個)<input type="checkbox" name="hobby[]" value="1">$_POST['hobby']陣列
下拉選單<select name="city"><option value="bj">北京</option></select>$_POST['city']字符串
多選下拉<select name="city[]" multiple>...</select>$_POST['city']陣列
文件上傳<input type="file" name="avatar">$_FILES['avatar']陣列(含 tmp_name, name, size, error, type)

六、安全最佳實踐清單

  1. 明確指定來源:用 $_GET 取查詢參數,用 $_POST 取表單提交,禁用 $_REQUEST。
  2. 檢查請求方法:處理頁面開頭驗證 $_SERVER['REQUEST_METHOD']。
  3. 輸入驗證與過濾:
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 120]]);
  4. 防 XSS 輸出編碼:htmlspecialchars($str, ENT_QUOTES, 'UTF-8')。
  5. 防 CSRF:表單隱藏 Token,服務端驗證。
  6. 文件上傳安全:驗證 MIME、副檔名、限制大小、重命名存儲、禁止腳本執行目錄。
  7. HTTPS 傳輸:生產環境強制 HTTPS,防止明文傳輸敏感數據。

七、進階:多維陣列表單設計

<!-- 批量編輯用戶 -->
<form method="post">
    <input type="hidden" name="users[1][id]" value="1" />
    <input type="text" name="users[1][name]" value="Alice" />
    <input type="email" name="users[1][email]" value="alice@example.com" />
    
    <input type="hidden" name="users[2][id]" value="2" />
    <input type="text" name="users[2][name]" value="Bob" />
    <input type="email" name="users[2][email]" value="bob@example.com" />
    
    <button type="submit">批量更新</button>
</form>

<?php
// 處理
foreach ($_POST['users'] as $userData) {
    // $userData = ['id'=>1, 'name'=>'Alice', 'email'=>'alice@example.com']
    // 更新數據庫...
}
?>

掌握表單數據接收的核心機制與安全規範,是 PHP 開發者的必修課。始終堅持「明確來源、嚴格驗證、安全輸出」三原則,才能構建經得起攻擊的 Web 應用。

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