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

JSP 安全開發:XSS 跨站腳本攻擊原理、實戰演示與防禦方案

     編輯:Java 相關知識

什麼是 XSS?

XSS (Cross-Site Scripting):攻擊者在網頁注入惡意腳本,受害者瀏覽時腳本在其瀏覽器執行,竊取 Cookie、劫持 Session、盜取鍵盤輸入、重導向釣魚頁、甚至透過 ActiveX 控制本機程式 (舊版 IE)。

為避免與 CSS (樣式表) 混淆,故取名 XSS。

XSS 三大類型

類型特徵儲存位置範例
反射型URL 參數直接輸出回應無 (即時)搜尋關鍵字、錯誤頁面
儲存型惡意碼存入資料庫資料庫留言板、評論、用戶資料
DOM 型前端 JS 處理 URL 片段前端邏輯單頁應用路由、錨點解析

實戰演示:從輸出到 RCE

環境:JSP + Servlet + SQL Server

1. 反射型 XSS (參數直接輸出)

<%-- index.jsp --%>
<% String op = request.getParameter("opr"); %>
<div><%= op %></div>

攻擊載荷:

?opr=<script>alert('XSS')</script>
?opr=<img src=x onerror=alert(1)>
?opr=<script>location.href='https://evil.com'</script>
?opr=<script>new ActiveXObject('WScript.Shell').Run('calc.exe')</script> (舊 IE)
?opr=<script>var fso=new ActiveXObject('Scripting.FileSystemObject');...</script> (寫檔)

2. 儲存型 XSS (留言板)

流程:

  1. 攻擊者在留言輸入 ``
  2. Servlet 存入資料庫 Comments 表
  3. 受害者瀏覽 comment.jsp,JSP 直接 `<%= comment.getContext() %>` 輸出
  4. 惡意腳本在受害者瀏覽器執行

關鍵程式碼:

<%-- comment.jsp 易受攻擊版 --%>
<c:forEach var="c" items="${all}">
  <td><%= c.getCName() %></td>
  <td><%= c.getCContext() %></td> <!-- 直接輸出未轉義 --%>
</c:forEach>

防禦方案:EL 表達式 + JSTL <c:out>

JSTL `` 內建 HTML 轉義,將 `< > & " '` 轉為實體字元,徹底中和腳本注入。

修正後 index.jsp

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<c:out value="${param.opr}" /> <!-- 自動轉義 --%>

修正後 comment.jsp

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<c:forEach var="x" items="${requestScope.all}">
  <tr>
    <td><c:out value="${x.cName}" /></td>
    <td><c:out value="${x.cContext}" /></td> <!-- 安全輸出 --%>
  </tr>
</c:forEach>

防禦深度解析

方案原理適用場景注意
<c:out>HTML 實體編碼JSP 頁面輸出預設 `escapeXml=true`,勿關閉
EL `${...}`不轉義!僅用於屬性值或 JS 字串 (需配合轉義)直接輸出 HTML 內容**不安全**
過濾器統一轉義ResponseWrapper 包裹 getWriter()全站舊專案快速修補可能誤傷合法 HTML
內容安全策略 (CSP)HTTP Header 限制腳本來源深度防禦、現代瀏覽器需精心調整策略
HttpOnly CookieJS 無法讀取 Cookie緩解 Session 劫持不防禦 XSS 本身

進階:Rich Text 需求怎麼辦?

若業務需允許部分 HTML (如粗體、連結),禁止黑名單過濾,必須使用白名單 HTML 淨化庫:

  • OWASP Java HTML Sanitizer:Google 維護、高效能、可配置標籤/屬性白名單
  • Jsoup.clean():`Jsoup.clean(html, Whitelist.basic())`
// 只允許 b, i, u, a, br
String safe = Jsoup.clean(userInput, Whitelist.basicWithImages());

開發檢查清單

  1. 所有使用者輸入輸出到 HTML 內容:`` / `escapeXml="true"`
  2. 輸出到 HTML 屬性:`` + 雙引號包裹
  3. 輸出到 JavaScript 字串:`JavaScriptEncoder` (OWASP Encoder)
  4. 輸出到 URL 參數:`URLEncoder.encode()`
  5. 富文本:白名單淨化 (Jsoup/OWASP Sanitizer)
  6. 設定 CSP Header:`Content-Security-Policy: script-src 'self';`
  7. Cookie 設定 `HttpOnly; Secure; SameSite=Strict`

總結

  • XSS 核心成因:**不受信資料未經轉義直接輸出到 HTML/JS/URL 語境**。
  • JSP 最簡單有效防禦:全面啟用 **JSTL ``** 替代 `<%= %>` 或 `${}`。
  • 儲存型 XSS 威脅最大,留言板、評論、個人資料皆為高危點。
  • 深度防禦:輸出編碼 + CSP + HttpOnly Cookie + 白名單淨化。
  • 技術無善惡,專研為善。安全是開發全生命週期的責任。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved