首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Struts2 表單特殊字元被轉義導致驗證失敗?用 StringEscapeUtils.unescapeHtml 還原

     編輯:程式設計綜合問答

現象

  • JSP 使用 <s:password name="password" ... value="(abcZyy" />。
  • 使用者輸入含括號 ( ) 的密碼。
  • Action Model 中對應屬性變為 &#40;abcZyy(HTML 實體編碼)。
  • 驗證比對資料庫明文密碼失敗。

原因

Struts2 預設對表單輸入執行 HTML 編碼(防 XSS),將特殊字元轉為實體。密碼欄位同樣受影響,導致原始字元改變。

解決方案

方案一:Action 中手動解碼(最快修復)

import org.apache.commons.text.StringEscapeUtils; // commons-text 1.9+

public class LoginAction extends ActionSupport {
    private String password;
    public void setPassword(String password) {
        this.password = StringEscapeUtils.unescapeHtml4(password); // 還原實體
    }
    // ...
}

需依賴 org.apache.commons:commons-text。

方案二:全域關閉特定欄位編碼(Struts 2.5+)


 


    
        password 
    

方案三:前端改用 <input type="password"> 繞過 Struts 標籤


原生 HTML 輸入不經 Struts 標籤處理,但需自行處理值回顯與 XSS 防護。

最佳實踐建議

  • 密碼永不應以明文回顯:value 屬性留空,登入失敗時不回填密碼,避免洩露與編碼問題。
  • 驗證端使用常數時間比對:MessageDigest.isEqual(hash1, hash2),防時序攻擊。
  • 全站 HTTPS + CSP + SameSite Cookie:從傳輸層與瀏覽器策略防護 XSS/CSRF,減少對框架編碼的依賴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved