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

PHP 安全取得超全域變數通用函數

     編輯:PHP 綜合知識

動機

直接存取 $_GET、$_POST、$_REQUEST 等超全域陣列,易產生「未定義索引」通知,且未對輸出做 HTML 轉義,存在 XSS 風險。封裝一個通用存取函數,可統一處理預設值、型別轉換、XSS 過濾。

函數實作

<?php
/**
 * 安全取得超全域變數值
 *
 * @param array  $source       來源陣列($_GET, $_POST, $_REQUEST, $_SERVER...)
 * @param string $key          索引鍵名
 * @param bool   $htmlEscape   是否執行 htmlspecialchars,預設 true
 * @param mixed  $default      找不到或空值時的預設值
 * @return mixed
 */
function cleanGlobal(array $source, $key, $htmlEscape = true, $default = null)
{
    if (array_key_exists($key, $source) && $source[$key] !== '' && $source[$key] !== null) {
        $val = $source[$key];
        return $htmlEscape ? htmlspecialchars($val, ENT_QUOTES, 'UTF-8') : $val;
    }
    return $default;
}
?>

使用範例

<?php
// 取得 $_GET['keyword'],自動轉義,預設空字串
$keyword = cleanGlobal($_GET, 'keyword', true, '');

// 取得 $_POST['age'],不轉義(後續自行驗證型別),預設 0
$age = cleanGlobal($_POST, 'age', false, 0);

// 取得 $_SERVER['HTTP_USER_AGENT'],不轉義
$ua = cleanGlobal($_SERVER, 'HTTP_USER_AGENT', false, 'Unknown');

// 直接在 HTML 中輸出安全
echo "<input type='text' name='kw' value='{$keyword}'>";
?>

進階擴充建議

  • 型別轉換:增加 $type = 'int|float|bool|array 參數,內部執行 filter_var() 或 intval()。
  • 驗證規則:整合 filter_input() 或 Respect/Validation 套件。
  • 來源自動偵測:依 $_SERVER['REQUEST_METHOD'] 自動選擇 $_GET/$_POST,簡化呼叫為 input('key')。
  • PSR-7 相容:若使用框架,改用 $request->getQueryParams() 等標準介面。

最佳實務提醒

  1. 輸出時轉義:本函數針對「輸出到 HTML」情境預設開啟轉義;若資料需寫入資料庫、JSON 回應、Shell 指令,請關閉 $htmlEscape 並在對應情境處理(Prepared Statement、json_encode、escapeshellarg)。
  2. 不要過度依賴全域函數:現代框架 (Laravel, Symfony) 提供 Request 物件與驗證機制,優先使用框架原生功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved