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

PHP 防禦 XSS 跨站腳本攻擊完整指南

     編輯:PHP 相關知識

PHP 與 XSS(跨站腳本攻擊)防禦

XSS(Cross-Site Scripting)是 Web 應用最常見的安全漏洞之一。攻擊者透過注入惡意腳本,竊取使用者 Cookie、Session、鍵盤輸入,甚至控制瀏覽器行為。本文說明 XSS 原理、PHP 常見防禦函數、編碼陷阱與一個完整的過濾函數範例。

XSS 攻擊原理

  • 使用者輸入未經過濾直接輸出到 HTML 頁面。
  • 瀏覽器將輸入視為 HTML/JS 執行。
  • 攻擊者構造含 <script>、onerror、javascript: 等的惡意連結或表單資料。

核心防禦原則

  1. 輸入過濾:在資料進入系統前驗證格式、長度、字元集。
  2. 輸出編碼:根據輸出語境(HTML、JS、CSS、URL)進行對應編碼。
  3. HTTPOnly Cookie:防止 JS 存取 Session Cookie。
  4. Content Security Policy (CSP):限制可執行腳本來源。

PHP 內建編碼函數

htmlentities()

<?php
$str = 'A quote is <b>bold</b>';
echo htmlentities($str);          // A quote is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES); // A 'quote' is &lt;b&gt;bold&lt;/b&gt;
?>
  • 預設編碼 ISO-8859-1,若頁面為 UTF-8 必須指定 htmlentities($str, ENT_QUOTES, 'UTF-8')。
  • 若輸入編碼非 ISO-8859-1 且未指定正確編碼,惡意腳本可能繞過過濾。

htmlspecialchars()

僅轉換 & " ' < > 五個特殊字元,效能優於 htmlentities(),適用於大多數 HTML 輸出場景。

完整 XSS 過濾函數範例

function RemoveXSS($val) {
    // 1. 移除不可列印控制字元(保留 CR、LF、TAB)
    $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '', $val);

    // 2. 解碼 HTML 實體與十六進位編碼,防止雙重編碼繞過
    $search = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()~`";:?+/={}[]-_|\';
    for ($i = 0; $i < strlen($search); $i++) {
        $val = preg_replace('/(&#[x|X]0{0,8}' . dechex(ord($search[$i])) . ';?)/i', $search[$i], $val);
        $val = preg_replace('/(�{0,8}' . ord($search[$i]) . ';?)/', $search[$i], $val);
    }

    // 3. 過濾危險標籤與事件處理器
    $ra1 = ['javascript','vbscript','expression','applet','meta','xml','blink','link','style','script','embed','object','iframe','frame','frameset','ilayer','layer','bgsound','title','base'];
    $ra2 = ['onabort','onactivate','onafterprint','onafterupdate','onbeforeactivate','onbeforecopy','onbeforecut','onbeforedeactivate','onbeforeeditfocus','onbeforepaste','onbeforeprint','onbeforeunload','onbeforeupdate','onblur','onbounce','oncellchange','onchange','onclick','oncontextmenu','oncontrolselect','oncopy','oncut','ondataavailable','ondatasetchanged','ondatasetcomplete','ondblclick','ondeactivate','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart', /* ...更多事件... */];

    $val = str_ireplace($ra1, '', $val);
    $val = str_ireplace($ra2, '', $val);

    return $val;
}

現代最佳實務建議

  • 使用成熟的安全庫(如 HTML Sanitizer、Sanitize),勿自行造輪子。
  • 採用模板引擎(Twig、Blade、Smarty)預設輸出轉義。
  • 設定 session.cookie_httponly=1、session.cookie_secure=1(HTTPS 環境)。
  • 部署 CSP 標頭:Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
  • 定期進行滲透測試與程式碼審查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved