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

PHP HTML 實體編碼與解碼:htmlspecialchars 與 htmlspecialchars_decode 完全指南

     編輯:PHP 相關知識

前言

防止 XSS(跨站腳本攻擊)的第一道防線是輸出轉義。PHP 提供 htmlspecialchars() 將特殊字元轉為 HTML 實體,與 htmlspecialchars_decode() 反向還原。本文詳細說明參數、編碼規則、常見陷阱與最佳實踐。

htmlspecialchars():字串轉 HTML 實體

語法

string htmlspecialchars(
    string $string,
    int $flags = ENT_COMPAT | ENT_HTML401,
    string $encoding = 'UTF-8',
    bool $double_encode = true
)

預設轉換對照表

字元實體說明
&&和號
""雙引號
''單引號(需 ENT_QUOTES)
<&lt;小於號
>&gt;大於號

flags 參數詳解

常數行為
ENT_COMPAT預設。僅轉換雙引號,單引號不動。
ENT_QUOTES雙引號與單引號皆轉換(推薦)。
ENT_NOQUOTES引號皆不轉換。
ENT_HTML401預設。HTML 4.01 規則。
ENT_HTML5HTML5 規則(支援更多實體)。
ENT_SUBSTITUTE無效編碼字元以 U+FFFD 取代(而非空字串)。
ENT_DISALLOWED文件類型不允許的字碼以 U+FFFD 取代。

encoding 參數

常用:UTF-8(預設)、ISO-8859-1、GB2312、BIG5。務必與實際輸出頁面編碼一致,否則會產生亂碼或安全漏洞。

範例

<?php
$str = "John & 'Adams'";

echo htmlspecialchars($str, ENT_COMPAT);   // John &amp; 'Adams'
echo htmlspecialchars($str, ENT_QUOTES);   // John &amp; 'Adams'
echo htmlspecialchars($str, ENT_NOQUOTES); // John &amp; 'Adams'

// 瀏覽器顯示皆為:John & 'Adams'
// 檢視原始碼才見實體差異
?>

htmlspecialchars_decode():實體還原字元

語法

string htmlspecialchars_decode(
    string $string,
    int $flags = ENT_COMPAT
)

僅處理上表五種實體,flags 行為與 htmlspecialchars() 對應。

範例

<?php
$str = "John &amp; 'Adams'";

echo htmlspecialchars_decode($str);              // John & 'Adams'
echo htmlspecialchars_decode($str, ENT_QUOTES);  // John & 'Adams'
echo htmlspecialchars_decode($str, ENT_NOQUOTES); // John & 'Adams'
?>

常見陷阱與最佳實踐

  1. 雙重編碼:預設 double_encode=true 會將 &amp; 再編碼為 &amp;amp;。若輸入已含實體,設 false 或改用 htmlentities() 配合 ENT_SUBSTITUTE。
  2. 編碼不一致:資料庫存 UTF-8,頁面輸出 GB2312 → 必須在 htmlspecialchars($str, ENT_QUOTES, 'UTF-8') 指定 UTF-8,再由 iconv 轉輸出編碼。
  3. 僅用於 HTML 內容:<script>、<style>、屬性值、URL 等語境需不同轉義策略(如 json_encode、urlencode)。
  4. PHP 8.1+ 預設編碼:default_charset 影響預設 encoding,建議顯式傳參避免驚喜。

速查:何時用什麼

場景推薦函數關鍵參數
HTML 文字內容輸出htmlspecialcharsENT_QUOTES, 'UTF-8'
HTML 屬性值輸出htmlspecialcharsENT_QUOTES, 'UTF-8'
需保留現有實體htmlspecialcharsdouble_encode=false
解碼用戶輸入的實體htmlspecialchars_decodeENT_QUOTES
完整 Unicode 實體轉換htmlentitiesENT_QUOTES | ENT_SUBSTITUTE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved