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

PHP 強化版 htmlspecialchars:shtmlspecialchars 遞迴處理陣列

     編輯:PHP 綜合知識

函數目的

將字串或陣列中所有值進行 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;
}

核心邏輯解析

  1. 遞迴遍歷:is_array 判斷,逐層處理。
  2. 基礎替換:str_replace 將四大特殊字元轉為實體。
  3. 防重複編碼:preg_replace 將已是實體形式的 &amp;...; 還原為 &...;,再由上一步轉為 &amp;...;,確保輸出只有單層編碼。

使用範例

$input = array(
    'title' => '<script>alert(1)</script>',
    'content' => 'Tom & Jerry',
    'nested' => array('comment' => '"quote"')
);

$safe = shtmlspecialchars($input);
/*
輸出:
array(
    'title' => '&lt;script&gt;alert(1)&lt;/script&gt;',
    'content' => 'Tom &amp; Jerry',  // 原本 & 變 &amp;,不會變 &amp;amp;
    'nested' => array('comment' => '&quot;quote&quot;')
)
*/

現代替代方案

  • 模板引擎自動逃逸:Blade、Twig、Smarty 等現代模板引擎預設自動 htmlspecialchars,無需手動呼叫。
  • 單一職責:僅在輸出時轉義,資料儲存保持原樣,避免重複編碼問題。

適用場景

舊專案無模板引擎、直接 echo 變數、需快速全站防 XSS 時可作為中介層統一處理 $_GET/$_POST。

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