在 PHP 開發中,處理使用者輸入的 HTML 內容是常見需求。許多開發者習慣使用 htmlspecialchars() 進行轉義,但實際上 strip_tags() 提供了更靈活的過濾機制,能夠精確控制允許保留的標籤。
htmlspecialchars() 會將所有特殊字符轉換為 HTML 實體,導致原本合法的標籤(如 <b>、<p>)以純文本形式顯示。而 strip_tags() 可通過第二個參數指定允許保留的標籤清單,例如:
$safe_html = strip_tags($input, '<p><br><strong><em>');
這樣既能移除腳本、iframe 等危險標籤,又能保留基本排版功能。
若業務需要保留圖片(<img>),直接放行該標籤可能引入外鏈風險。更優雅的方案是「二次處理」:
src 屬性;<img> 標籤全部移除;此法兼顧安全與體驗,還能統一圖片尺寸、添加懶加載屬性。
function filter_content($html) {
// 1. 保留基礎排版標籤
$allowed = '<p><br><strong><em><ul><ol><li>';
$clean = strip_tags($html, $allowed);
// 2. 提取圖片
$images = [];
preg_match_all('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $html, $matches);
if (!empty($matches[1])) {
$images = array_unique($matches[1]);
}
// 3. 移除原圖片標籤(已在 strip_tags 中被剔除)
// 4. 返回結構化數據供前端渲染
return [
'html' => $clean,
'images' => array_values($images)
];
}
HTMLPurifier 庫處理複雜 XSS 場景;掌握這套「過濾 + 提取 + 重構」流程,能顯著提升內容安全性與呈現質量。