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

PHP 安全顯示用戶輸入:防止 XSS 攻擊的最佳實踐

     編輯:PHP 相關知識

前言:未過濾輸出的隱患

在 Web 開發中,直接將用戶提交的數據輸出到頁面是極其危險的。惡意用戶可能在輸入中嵌入 JavaScript 代碼,例如:

<script language="javascript">alert('Do something bad!');</script>

若未經過濾直接輸出,這段腳本將在受害者瀏覽器中執行,導致跨站腳本攻擊(XSS)。即使非惡意輸入,未閉合的 HTML 標籤也可能破壞頁面結構,導致排版錯亂或內容截斷。

方案一:純文本輸出(最簡單但功能受限)

使用 htmlspecialchars() 將所有特殊字符轉換為 HTML 實體編碼:

$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

這樣 <b> 會變為 &lt;b&gt;,徹底消除 HTML 注入風險。但缺點是用戶無法使用任何格式化功能。

方案二:自定義標記語言(推薦平衡方案)

參考 BBCode 風格,提供安全的標記供用戶使用:

  • [b]粗體[/b] → <strong>粗體</strong>
  • [i]斜體[/i] → <em>斜體</em>
  • [link="url"]連結[/link] → <a href="url">連結</a>
  • [quote]引用[/quote] → <blockquote>引用</blockquote>

核心處理邏輯

<?php
function format_output($output) {
    // 1. 先完全轉義,徹底禁用原始 HTML
    $output = htmlspecialchars(stripslashes($output), ENT_QUOTES, 'UTF-8');
    
    // 2. 再轉換自定義標記為安全 HTML
    $output = str_replace('[b]', '<strong>', $output);
    $output = str_replace('[/b]', '</strong>', $output);
    $output = str_replace('[i]', '<em>', $output);
    $output = str_replace('[/i]', '</em>', $output);
    
    // 處理連結(需防範 javascript: 協議)
    $output = str_replace('[link="javascript', '[link=" javascript', $output);
    $output = preg_replace('/\[link="([^"]+)"\]/', '<a href="$1">', $output);
    $output = str_replace('[/link]', '</a>', $output);
    
    // 3. 最後處理換行
    return nl2br($output);
}
?>

關鍵原則總結

  1. 順序至關重要:必須先 htmlspecialchars() 再替換自定義標記,否則自定義標記產生的 HTML 會被再次轉義
  2. 連結安全:攔截 javascript: 協議,防止通過連結注入腳本
  3. 引號處理:轉義後雙引號變為 &quot;,正則需匹配實體編碼後的字符
  4. 換行轉換:nl2br() 必須在最後調用

適用場景

  • 留言板、評論系統
  • 論壇發帖、回覆
  • 用戶建議、反饋表單
  • 系統公告、通知內容

這種「白名單」機制既保證了安全性,又賦予用戶基本排版能力,是處理用戶生成內容(UGC)的經典最佳實踐。

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