PHP 提供多種字串過濾函數,但開發者常混淆其用途、邊界與安全性。本文深度解析 htmlspecialchars、strip_tags、htmlentities、addslashes/stripslashes 的核心差異、適用場景、安全陷阱與最佳實踐組合。
| 函數 | 核心功能 | 處理範圍 | 典型用途 | 安全等級 |
|---|---|---|---|---|
| htmlspecialchars | 特殊字元 → HTML 實體 | 4 個字元 (& " < >) | HTML 輸出編碼 (XSS 防禦核心) | ⭐⭐⭐⭐⭐ |
| htmlentities | 所有字元 → HTML 實體 | 所有非 ASCII 字元 | 完整實體化、郵件模板 | ⭐⭐⭐⭐ |
| strip_tags | 移除 HTML/PHP 標籤 | 標籤結構 | 內容摘要、純文本輸出 | ⭐⭐ (不可信輸入慎用) |
| addslashes | 引號/反斜線/NULL 加反斜線 | ' " \ NUL | 舊式 SQL 轉義 (已棄用) | ⭐ (不安全) |
& (和號) → & " (雙引號) → " < (小於) → < > (大於) → >
htmlspecialchars($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding = 'UTF-8', $double_encode = true)
function h($str) {
return htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
// 使用
echo "" . h($userInput) . "";
echo ""; // 單引號屬性也安全
<tag>、</tag>、<?php ... ?>、<% ... %>strip_tags($str, '
')
$input = ''; echo strip_tags($input); // 輸出: 空字串 (標籤被移除) // 但若允許某些標籤: echo strip_tags($input, '
'); // 輸出:
— XSS 依然生效!
結論:strip_tags不能防禦 XSS,僅適合「完全受信內容」的純文本提取。不可信輸入必須配合htmlspecialchars。
$str = "中文 & 特殊