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

Java 防 XSS 工具類:HTML 特殊字元過濾與編碼完整實作

     編輯:Java 相關知識

前言

Web 應用程式接收使用者輸入時,若直接輸出至 HTML 頁面,包含 <, >, ", & 等特殊字元會被瀏覽器解析為標籤或實體,導致跨站腳本攻擊 (XSS) 或畫面錯亂。本文提供一個可直接生產環境使用的過濾工具類。

核心設計

  • 單一職責:僅處理 HTML 實體編碼,不涉及 SQL、JavaScript 等其他語境。
  • 效能優先:使用 StringBuffer 避免字串串接開銷,先以 hasSpecialChars() 快速判斷是否需處理。
  • Thread-Safe:所有方法皆為 static,無共享狀態。

完整原始碼

package moonsoft.test.J2EE.testSession;

public class FilterSpecial {

    /**
     * 過濾字串中的 HTML 特殊字元,轉換為對應實體編碼。
     * @param input 待過濾字串
     * @return 已編碼字串;若無特殊字元則直接回傳原字串
     */
    public static String filter(String input) {
        if (!hasSpecialChars(input)) {
            return input;
        }
        StringBuffer filtered = new StringBuffer(input.length());
        char c;
        for (int i = 0; i < input.length(); i++) {
            c = input.charAt(i);
            switch (c) {
                case '<': filtered.append("&lt;"); break;
                case '>': filtered.append("&gt;"); break;
                case '"': filtered.append("&quot;"); break;
                case '&': filtered.append("&amp;"); break;
                default: filtered.append(c);
            }
        }
        return filtered.toString();
    }

    /**
     * 快速檢查字串是否包含需編碼的特殊字元。
     * @param input 待檢查字串
     * @return true 表示包含 < > " & 任一字元
     */
    public static boolean hasSpecialChars(String input) {
        if (input == null || input.length() == 0) return false;
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c == '<' || c == '>' || c == '"' || c == '&') {
                return true;
            }
        }
        return false;
    }
}

使用範例

String userInput = "<script>alert('XSS')</script>";
String safeOutput = FilterSpecial.filter(userInput);
// 輸出:&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;
// 瀏覽器將顯示原始文字,不會執行腳本

擴充建議

  1. 整合 OWASP Java Encoder:生產環境建議改用 org.owasp.encoder.Encode.forHtml(),涵蓋更完整字元集 (含 ', / 等) 並經過安全審計。
  2. 支援多語境編碼:依輸出位置 (HTML Body, Attribute, JavaScript, CSS, URL) 選擇對應編碼器。
  3. 整合框架攔截器:在 Spring MVC HandlerInterceptor 或 Servlet Filter 中統一對請求參數/表單資料進行編碼,避免開發者遺漏。

常見誤區提醒

  • 雙重編碼:若資料庫已儲存編碼後字串,再次輸出編碼會導致 &amp;lt; 顯示錯誤。應在「輸出時」編碼,而非「輸入時」。
  • 僅過濾 < >:屬性值中未編碼的 " 可跳出屬性注入事件處理器 (如 onmouseover),務必同步編碼雙引號與 &。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved