將字串或陣列中所有值進行 HTML 實體編碼,防止 XSS 攻擊。支援遞迴處理多維陣列,並針對已編碼的實體(如 &)避免重複編碼。
/**
* 遞迴 HTML 實體編碼,防止重複編碼
* @param mixed $string 字串或陣列
* @return mixed 編碼後的值
*/
function shtmlspecialchars($string) {
if (is_array($string)) {
foreach ($string as $key => $val) {
$string[$key] = shtmlspecialchars($val);
}
} else {
// 先將 &entity; 還原為 &entity;,避免雙重編碼
$string = preg_replace(
'/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/',
'&\\1',
str_replace(
array('&', '"', '<', '>'),
array('&', '"', '<', '>'),
$string
)
);
}
return $string;
}
is_array 判斷,逐層處理。str_replace 將四大特殊字元轉為實體。preg_replace 將已是實體形式的 &...; 還原為 &...;,再由上一步轉為 &...;,確保輸出只有單層編碼。$input = array(
'title' => '<script>alert(1)</script>',
'content' => 'Tom & Jerry',
'nested' => array('comment' => '"quote"')
);
$safe = shtmlspecialchars($input);
/*
輸出:
array(
'title' => '<script>alert(1)</script>',
'content' => 'Tom & Jerry', // 原本 & 變 &,不會變 &amp;
'nested' => array('comment' => '"quote"')
)
*/
htmlspecialchars,無需手動呼叫。舊專案無模板引擎、直接 echo 變數、需快速全站防 XSS 時可作為中介層統一處理 $_GET/$_POST。