Web 應用程式接收使用者輸入時,若直接輸出至 HTML 頁面,包含 <, >, ", & 等特殊字元會被瀏覽器解析為標籤或實體,導致跨站腳本攻擊 (XSS) 或畫面錯亂。本文提供一個可直接生產環境使用的過濾工具類。
StringBuffer 避免字串串接開銷,先以 hasSpecialChars() 快速判斷是否需處理。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("<"); break;
case '>': filtered.append(">"); break;
case '"': filtered.append("""); break;
case '&': filtered.append("&"); 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);
// 輸出:<script>alert("XSS")</script>
// 瀏覽器將顯示原始文字,不會執行腳本
org.owasp.encoder.Encode.forHtml(),涵蓋更完整字元集 (含 ', / 等) 並經過安全審計。HandlerInterceptor 或 Servlet Filter 中統一對請求參數/表單資料進行編碼,避免開發者遺漏。&lt; 顯示錯誤。應在「輸出時」編碼,而非「輸入時」。< >:屬性值中未編碼的 " 可跳出屬性注入事件處理器 (如 onmouseover),務必同步編碼雙引號與 &。