直接存取 $_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')。$request->getQueryParams() 等標準介面。$htmlEscape 並在對應情境處理(Prepared Statement、json_encode、escapeshellarg)。