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

PHP GET/POST 數據傳遞安全風險與防範最佳實踐

     編輯:PHP 相關知識

GET vs POST 安全本質

  • GET:參數在 URL 可見、可收藏、可緩存、長度受限、**不應用於敏感操作/修改數據** (幂等性)。
  • POST:參數在 Body、不顯示 URL、無長度限制、**用於狀態變更操作** (登錄、提交表單、上傳)。
  • 核心誤區:POST **不比 GET 更安全**。抓包工具、瀏覽器開發者工具均可輕易查看/修改 POST 數據。**安全防護必須在服務端實施**。

常見攻擊向量

  1. XSS (跨站腳本):未經過濾輸出到 HTML/JS 上下文。
  2. SQL 注入:未使用預處理直接拼接 SQL。
  3. CSRF (跨站請求偽造):缺乏 Token 驗證,攻擊者誘導用戶提交表單。
  4. 參數篡改/遍歷:id=1 → id=2 訪問他人數據 (缺乏授權檢查)。
  5. 文件上傳漏洞:未驗證類型、內容、存儲路徑執行腳本。

代碼審計:文中提供的「安全類」缺陷分析

文章附帶一個 safe 類 (同 ID 149363),存在嚴重問題:

  • 混淆 HTML 編碼與 SQL 轉義。
  • 使用棄用 mysql_escape_string。
  • nl2br 位置錯誤導致標簽被誤刪。
  • 全局變量污染風險。

現代防範檢查清單

1. 輸入驗證 (白名單優先)

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$action = in_array($_POST['action'], ['add','edit','delete']) ? $_POST['action'] : 'default';

2. 輸出編碼 (上下文感知)

// HTML 內容
echo htmlspecialchars($userInput, ENT_QUOTES | ENT_HTML5, 'UTF-8');

// HTML 屬性
echo '';

// JavaScript 變量
echo '';

// URL 參數
echo '';

3. 數據庫操作 (預處理語句)

$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ? AND status = ?");
$stmt->execute([$email, 1]);

4. CSRF 保護


// 生成表單
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
echo '';

// 驗證
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) die('CSRF validation failed');

5. 權限控制 (RBAC/ACL)

每個敏感操作必須驗證當前用戶是否擁有對應資源的操作權限,而非僅依賴參數。

總結

GET/POST 傳遞機制本身無安全性可言。**安全 = 輸入驗證 + 業務授權 + 上下文編碼 + 參數化查詢 + CSRF Token + 最小權限**。棄用舊式「萬能過濾類」,擁抱現代框架內置的安全組件。

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