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

PHP HTML 屬性過濾類:防 XSS 保留安全屬性

     編輯:PHP 綜合知識

類別用途

HtmlAttributeFilter 解析 HTML 字串,移除不在白名單中的標籤屬性,防範 XSS 攻擊,同時保留必要屬性(如 id、class、href)。支援標籤級例外規則與忽略標籤清單。

核心代碼結構 (HtmlAttributeFilter.class.php)

<?php
class HtmlAttributeFilter {
    private $_str = '';
    private $_allow = [];      // 全域允許屬性:['id','class','title']
    private $_exception = [];  // 標籤例外:['a' => ['href','class'], 'img' => ['src','alt']]
    private $_ignore = [];     // 忽略過濾標籤:['script','style']

    public function strip($str) { /* 主入口 */ }
    public function setAllow(array $allow) { $this->_allow = $allow; }
    public function setException(array $exc) { $this->_exception = $exc; }
    public function setIgnore(array $ignore) { $this->_ignore = $ignore; }

    private function findElements() { /* 正則提取所有標籤 */ }
    private function findAttributes($nodes) { /* 解析屬性 name="value" */ }
    private function removeAttributes($nodes) { /* 依白名單/例外決定保留/移除 */ }
    private function isException($tag, $attr) { /* 判斷是否例外 */ }
    private function createAttributes($node) { /* 重組安全屬性字串 */ }
    private function protect($str) { /* 特殊字元轉義 */ }
}

使用範例

$filter = new HtmlAttributeFilter();
$filter->setAllow(['id', 'class', 'style']);
$filter->setException([
    'a' => ['href', 'title', 'target'],
    'img' => ['src', 'alt', 'width', 'height'],
    'input' => ['type', 'value', 'name']
]);
$filter->setIgnore(['script', 'style']); // 完全不處理

$html = '<div id="main" onclick="alert(1)"><a href="/link" onmouseover="xss()">Link</a></div>';
$safe = $filter->strip($html);
// 結果:<div id="main"><a href="/link">Link</a></div>

關鍵實作細節

  • 正則解析:使用 preg_match_all 分兩階段提取「標籤」與「屬性」,避免單一複雜正則難以維護。
  • 大小寫處理:內部統一轉小寫比對,輸出保持原始大小寫(透過 protect 機制)。
  • 例外優先:標籤屬於例外清單時,合併全域白名單與該標籤專屬白名單。
  • 忽略標籤:script、style 等敏感標籤直接跳過,避免破壞內容或誤判。

安全性考量

  • 僅過濾屬性,不移除標籤本身。若需標籤級白名單,請搭配 strip_tags 或 HTMLPurifier 使用。
  • 正則解析 HTML 存在邊界案例風險(巢狀標籤、屬性值含 > 等),高安全需求場景請改用 HTMLPurifier。
  • 輸出前建議再次 htmlspecialchars 雙重防護。

結語

HtmlAttributeFilter 以白名單機制精準控制 HTML 屬性,適合「信任標籤結構、僅需清理屬性」的中低風險場景(如 CMS 後台內容儲存前預處理)。高風險場景(使用者任意 HTML 輸入)務必採用完整 HTML 淨化庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved