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

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

     編輯:PHP 相關知識

理解 XSS 攻擊成因

跨站腳本攻擊(XSS)的核心原因在於應用程式未對使用者輸入進行嚴格過濾,導致惡意腳本被注入頁面並在受害者瀏覽器中執行。防禦的關鍵在於「輸入過濾」與「輸出編碼」雙重把關,確保所有進入系統的資料在儲存前、輸出前都經過妥善處理。

基礎防護:善用 htmlentities() 函數

PHP 內建的 htmlentities() 可將特殊字元轉換為 HTML 實體,有效中和腳本標籤與引號。預設編碼為 ISO-8859-1,若專案採用 UTF-8,務必明確指定編碼參數,避免過濾失效。

<?php
$str = 'A "quote" is <b>bold</b>';
// 輸出:A &quot;quote&quot; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
?>

注意: 單純依賴 htmlentities() 仍有盲區,例如編碼不匹配、雙重編碼繞過等情況,建議搭配更完整的過濾策略。

進階防護:自訂 RemoveXSS() 深度過濾函數

以下函數示範多層次過濾邏輯,包含移除不可列印字元、解碼實體編碼、封鎖危險標籤與事件屬性,適合作為參考基礎再依專案需求調整:

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

    // 2. 還原常見實體編碼(十六進位、十進位)
    $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. 封鎖危險 HTML 標籤與事件屬性
    $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','ondrop','onerror','onerrorupdate','onfilterchange','onfinish','onfocus','onfocusin','onfocusout','onhelp','onkeydown','onkeypress','onkeyup','onlayoutcomplete','onload','onlosecapture','onmousedown','onmouseenter','onmouseleave','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onmove','onmoveend','onmovestart','onpaste','onpropertychange','onreadystatechange','onreset','onresize','onresizeend','onresizestart','onrowenter','onrowexit','onrowsdelete','onrowsinserted','onscroll','onselect','onselectionchange','onselectstart','onstart','onstop','onsubmit','onunload'];
    $ra = array_merge($ra1, $ra2);

    $found = true;
    while ($found) {
        $val_before = $val;
        foreach ($ra as $keyword) {
            $pattern = '/';
            for ($j = 0; $j < strlen($keyword); $j++) {
                if ($j > 0) {
                    $pattern .= '(&#[x|X]0{0,8}([a][b]);?)?|(�{0,8}([10][13]);?)?';
                }
                $pattern .= $keyword[$j];
            }
            $pattern .= '/i';
            $replacement = substr($keyword, 0, 2) . '<x>' . substr($keyword, 2);
            $val = preg_replace($pattern, $replacement, $val);
        }
        $found = ($val_before !== $val);
    }
    return $val;
}
?>

最佳實務建議

  • 輸出端編碼優先: 在輸出到 HTML、JavaScript、CSS、URL 等不同語境時,使用對應的編碼函式(如 htmlspecialchars()、json_encode()、urlencode())。
  • 採用 CSP 標頭: 設定 Content-Security-Policy 限制腳本來源,提供第二道防線。
  • 使用成熟函式庫: 生產環境建議採用 HTMLPurifier 等經過驗證的函式庫,避免自行撰寫正則表達式產生漏洞。
  • HttpOnly Cookie: 設定 Cookie 的 HttpOnly 標誌,降低竊取 Session 風險。

總結

防範 XSS 需要「深度防禦」思維:輸入端過濾、輸出端編碼、HTTP 標頭加固、成熟工具輔助,四管齊下才能有效降低風險。定期進行滲透測試與程式碼審查,確保防護措施持續有效。

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