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

PHP strip_tags 函數缺陷深度解析:為什麼它會誤刪合法內容?

     編輯:PHP 相關知識

現象重現

$str = '<div>string</div>string<FONT ></FONT>string<b>hello</b><div>string</div>';
echo strip_tags($str, '<div>');

期望輸出

<div>string</div>string<FONT ></FONT>stringhello<div>string</div>

實際輸出

<div>string</div>string

根因分析

PHP 官方文檔明確警告:

Warning: Because strip_tags() does not actually validate HTML, partial or broken tags can result in the removal of more data than expected.

關鍵點在於 <FONT ></FONT> 中的孤立「<」字符。strip_tags 掃描到這個「<」時,誤以為是標籤開始,但後續無法匹配完整標籤結構,導致解析器進入錯誤狀態,直接丟棄後續所有內容。

底層邏輯簡述

  1. 掃描字符串,遇到「<」進入標籤解析模式。
  2. 嘗試匹配合法標籤名(字母數字)、屬性、閉合「>」。
  3. 若匹配失敗(如遇到空格、換行、孤立符號),標記為「破損標籤」。
  4. 破損標籤觸發保護機制:直接截斷後續輸出,防止 XSS 殘留風險。

為什麼不修復?

strip_tags 設計初衷是「快速、簡單、保守」的標籤剝離,非完整 HTML 解析器。引入完整解析器(如 DOMDocument)會大幅增加性能開銷與複雜度,違背其輕量定位。

替代方案對比

方案優點缺點適用場景
strip_tags內置、極快、無依賴破損標籤導致數據丟失、無法處理屬性過濾純文本輸入、可信來源、簡單過濾
HTMLPurifier標準兼容、XSS 防護、可配置白名單體積大、性能較慢、需 Composer 安裝富文本編輯器輸出、用戶生成內容(UGC)
DOMDocument + XPath原生、結構化操作、可精確保留屬性錯誤容錯差、需手動處理實體編碼結構化 HTML 片段處理、模板渲染
正則表達式靈活、無依賴極易寫錯、HTML 不規則難覆蓋、性能不可控極簡場景、臨時腳本

最佳實踐建議

  1. 不要用 strip_tags 處理不可信的富文本輸入——它不是安全函數。
  2. 用戶生成內容(評論、文章、簽名)必須使用 HTMLPurifier,配置允許標籤/屬性白名單。
  3. 若僅需「去除所有標籤獲取純文本」,可用 strip_tags 但需預先清洗孤立「<」「>」:
    $str = str_replace(['<', '>'], ['&lt;', '&gt;'], $str); 再調用。
  4. 模板引擎輸出時使用 {$var|escape:'html'}(Smarty)或 htmlspecialchars,而非 strip_tags。

總結

strip_tags 是一把「鈍刀」:快但不準,遇到破損標籤會誤傷無辜內容。理解其「保守截斷」行為,在正確場景(可信簡單輸入)使用,複雜場景轉向專業庫,才能兼顧安全與數據完整性。

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