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

PHP 安全過濾函數深度解析:htmlspecialchars、strip_tags 與 addslashes 實戰指南

     編輯:PHP 相關知識

前言:為何輸入過濾是 Web 開發的第一道防線

在 PHP 開發中,處理用戶輸入數據的安全性始終是核心課題。htmlspecialchars、strip_tags 與 addslashes 是三個最基礎且高頻使用的字符串處理函數,它們雖然看似簡單,但各自有著明確的適用場景與潛在陷阱。本文將從原理、差異、最佳實踐三個維度,為你徹底釐清這三大函數的正確用法。

一、strip_tags:剝離標籤的「刮鬍刀」

核心功能

strip_tags(string $string, array|string|null $allowed_tags = null) 旨在從字符串中移除 HTML、XML 以及 PHP 標籤。你可以通過第二個參數指定允許保留的標籤(如 <b>、<i>)。

關鍵特性與避坑指南

  • 容錯性差:若輸入字符串包含不完整的標籤(如缺少閉合尖括號 >),函數可能返回錯誤結果或截斷數據。
  • 屬性不會被移除:保留的標籤其屬性(如 onclick、style)依然存在,仍可能引發 XSS 攻擊。
  • 非遞歸處理:無法處理嵌套編碼或雙重編碼的惡意輸入。

最佳實踐

僅用於完全可信的數據源(如後台編輯器輸出的純文本預覽),嚴禁用於用戶提交數據的安全過濾。現代項目建議改用 HTMLPurifier 等專業庫。

二、htmlspecialchars:輸出轉義的「黃金標準」

核心功能

將特殊字符轉換為對應的 HTML 實體,防止瀏覽器將其解析為標籤或腳本。默認轉換四大字符:

原字符轉義後
& (和號)&amp;
" (雙引號)&quot;
< (小於號)&lt;
> (大於號)&gt;

關鍵參數詳解

htmlspecialchars(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null): string
  • ENT_QUOTES(推薦):同時轉義單雙引號,防止屬性注入(如 <input value='...'>)。
  • ENT_HTML5:PHP 5.4+ 支持,符合 HTML5 規範。
  • encoding:務必顯式指定(如 'UTF-8'),避免多字節字符截斷導致繞過轉義。

適用場景

所有輸出到 HTML 頁面的動態數據:模板變量、API 返回的 JSON 嵌入頁面、日志輸出等。這是防禦 XSS 的核心手段。

三、htmlentities:全字符轉義的「重型武器」

將所有可轉換字符(含多字節字符、特殊符號)轉為實體。雖然徹底,但會導致頁面體積膨脹、可讀性下降,且對 UTF-8 等現代編碼支持不如 htmlspecialchars 完善。一般業務無需使用,僅在特殊編碼兼容場景下考慮。

四、addslashes 與 stripslashes:數據庫時代的「遺產」

原理

addslashes() 在單引號(')、雙引號(")、反斜線(\)與 NUL 字符前添加反斜線;stripslashes() 則執行逆操作。

為何現代開發已棄用

  1. 非針對性:不同數據庫轉義規則不同(MySQL 需轉義 \n \r \x1a,PostgreSQL 則不同)。
  2. 編碼風險:多字節字符(如 GBK)中可能包含 0x5c(\),導致注入繞過(經典「寬字節注入」)。
  3. 雙重轉義:若開啟 magic_quotes_gpc(PHP 5.4 已移除),會造成數據污染。

現代替代方案

  • PDO 預處理語句:$stmt->execute([$userInput]),驅動層自動處理轉義,徹底分離代碼與數據。
  • 專用轉義函數:如 mysqli_real_escape_string()(僅限無法使用預處理的極端場景)。

五、總結:如何選擇正確的函數?

場景推薦函數/方案核心原則
輸出到 HTML 內容/屬性htmlspecialchars($str, ENT_QUOTES, 'UTF-8')上下文感知輸出編碼
輸出到 JavaScript 變量json_encode() + 模板非轉義標記結構化序列化
寫入數據庫PDO 預處理 / 參數綁定代碼數據分離
清理富文本編輯器內容HTMLPurifier / DOMPurify白名單標籤/屬性過濾
簡單去標籤(可信源)strip_tags($str, '<b><i>')僅作展示用途
金律:永遠在輸出時根據上下文進行編碼,而非在輸入時「清洗」數據。輸入驗證(長度、格式、類型)與輸出編碼是兩道獨立防線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved