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

PHP 防止 XSS 攻擊:JavaScript 注入過濾與 strip_tags 實戰

     編輯:PHP 相關知識

使用者輸入若未經過濾直接輸出至頁面,極易導致跨站腳本攻擊(XSS)。本文介紹針對 <script>、<style>、<img> 等高危標籤的正則過濾與 strip_tags 組合防禦策略。

方案一:針對性正則移除 script 標籤

$pattern = '/<script[^>]*>.*?<\/script>/si';
$keyword = preg_replace($pattern, ' ', $_POST['searchword']);
// i: 不區分大小寫 | s: . 匹配換行符

方案二:strip_tags 結合正則二次檢查

<?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 內容儲存 |

最佳實踐:輸出端編碼(Context-Aware Encoding)

過濾輸入不如編碼輸出可靠。 根據輸出上下文選擇編碼函式:

  • HTML 內文/屬性: htmlspecialchars($str, ENT_QUOTES, 'UTF-8')
  • JavaScript 變數: json_encode($str) 並確保 Content-Type 正確
  • URL 參數: urlencode($str)
  • CSS 值: 使用專用 CSS 編碼庫

額外防禦層

  1. CSP (Content-Security-Policy):限制腳本來源,即使注入成功也無法執行
  2. HttpOnly Cookie:防止 JS 竊取 Session ID
  3. 輸入驗證:長度、格式、字元集白名單驗證
  4. WAF/框架內建防護:Laravel {!! !!}、CodeIgniter xss_clean() 等

單純依賴正則過濾 <script> 並不足以防禦現代 XSS 攻擊(事件屬性、CSS expression、SVG onload 等繞過手法層出不窮)。建立「輸入驗證 + 輸出編碼 + CSP」的纵深防禦體系才是根本之道。

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