使用者輸入若未經過濾直接輸出至頁面,極易導致跨站腳本攻擊(XSS)。本文介紹針對 <script>、<style>、<img> 等高危標籤的正則過濾與 strip_tags 組合防禦策略。
$pattern = '/<script[^>]*>.*?<\/script>/si'; $keyword = preg_replace($pattern, ' ', $_POST['searchword']); // i: 不區分大小寫 | s: . 匹配換行符
<?php
$title = "<style>ssss{'float:right'}</style>";
$title = strip_tags($title); // 先移除所有 HTML/JS 標籤
// 二次檢查是否有殘留高危標籤內容
if (preg_match('/<style>(.*)<\/style>|<script>(.*)<\/script>|<img src=(.*)>/', $title, $info)) {
$title = $info[1]; // 取捕獲組內容(視業務邏輯決定保留或丟棄)
} else {
$title = $title;
}
echo $title;
?>
preg_replace 移除特定標籤 | 精準控制、保留其他 HTML | 正則難以覆蓋所有變形繞過 | 允許部分 HTML 的輸入欄位 |
| strip_tags | 簡單、移除所有標籤 | 無法防禦屬性型 XSS(如 onload) | 純文字輸入欄位 |
| htmlspecialchars | 徹底編碼、最安全 | 輸出為純文字,失去排版 | 所有不可信輸出場景(首選) |
| HTMLPurifier | 白名單機制、標準相容 | 效能較差、體積大 | 富文本編輯器、CMS 內容儲存 |
過濾輸入不如編碼輸出可靠。 根據輸出上下文選擇編碼函式:
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')json_encode($str) 並確保 Content-Type 正確urlencode($str){!! !!}、CodeIgniter xss_clean() 等單純依賴正則過濾 <script> 並不足以防禦現代 XSS 攻擊(事件屬性、CSS expression、SVG onload 等繞過手法層出不窮)。建立「輸入驗證 + 輸出編碼 + CSP」的纵深防禦體系才是根本之道。