在開發文章系統、評論區、論壇等使用者生成內容(UGC)場景時,若直接儲存並輸出使用者提交的原始 HTML,極易導致 XSS 跨站腳本攻擊、版面錯亂或惡意程式碼注入。因此,伺服端必須對輸入進行嚴格的標籤過濾與轉義。
| 函式 | 用途 | 優點 | 缺點 |
|---|---|---|---|
htmlspecialchars() | 將特殊字元轉為 HTML 實體 | 完全中斷 HTML 結構,安全性最高 | 所有標籤均顯示為純文字,無法保留排版 |
strip_tags() | 移除 HTML/PHP 標籤,可指定允許清單 | 保留純文字內容,支援白名單機制 | 屬性值未處理,可能殘留 onclick 等事件屬性 |
實測發現 strip_tags() 在處理巢狀標籤、不完整標籤時表現更穩健,但單純使用仍不足以應對「保留圖片、過濾腳本」的混合需求。
參考微博、QQ 空間的動態呈現邏輯,採用「過濾 → 提取 → 重組」三步驟:
strip_tags($content, '<img>') 僅保留 <img> 標籤。src、alt、width/height 等屬性,建立圖片資料陣列。function purify_content($raw_html) {
// 1. 僅保留 img 標籤
$clean = strip_tags($raw_html, '<img>');
// 2. 提取圖片資訊
$images = [];
preg_match_all('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $clean, $matches);
foreach ($matches[1] as $idx => $src) {
// 可在此驗證圖片域名、大小、格式
$images[] = ['src' => $src, 'order' => $idx];
}
// 3. 移除所有標籤得純文字
$text = strip_tags($clean);
return [
'text' => $text,
'images' => $images
];
}
*.yourcdn.com、wx.qlogo.cn)。onload、onerror、style 等高風險屬性。Content-Security-Policy: img-src 'self' https://trusted-cdn.com; 從瀏覽器層面攔截異常請求。單一函式無法完美平衡安全與體驗。採用「伺服端嚴格清洗 + 結構化資料輸出 + 前端彈性渲染」的分層架構,才能同時達成 XSS 防護、圖文混排、多端適配三大目標。