JBoss 項目修復筆記:繞開 iframe 安全問題,JSF 與 Angular 最小代價共存方案

JBoss 項目修復筆記:繞開 iframe 安全問題,JSF 與 Angular 最小代價共存方案

本篇筆記銜接的內容為:JBoss + WildFly 本地開發環境完全指南,里面簡單的描述了一下怎么配置 docker,在本地啟動一個可以運行的 JBoss 和 WildFly 服務器,接下來就簡單描述一下想要解決的問題,以及目前看來比較可靠的解決方法

前言- 背景介紹 & 目標

簡單的 recap 一下,我們現在的問題是:

  • 前端還在使用 JSF
    畢竟這是一個老項目了,還在 active support 這個項目的那段時光里,JSF 畢竟還是主流
  • 前端嘗試使用 AngularJS
    是 AngularJS,不是 Angular;是 1.x 的版本,不是 2.0+。當時的開發大概是感受到了 JSF 混合 xhtml 的問題——冗長、結構特別復雜、沉重并難以增添新的功能。再搭配上 AngularJS 的確是有 Google 背書,也出現了不少社區支持的 packages,比如說 ng-grid,ng-table 之類,實現起來比春寫 JSF 要容易不少
    目前來說我并沒有打算深挖 AngularJS 的打算,畢竟我開始做的時候就做 SPA 了,雖然簡單的碰過一點 Angular 的內容,也寫了點筆記,不過畢竟不是主營
  • 使用 iframe 導入 AngularJS 實現的頁面
    這里主要的問題在于,主 xhtml 和使用 iframe 導入的 AngularJS 頁面并不分享一個共同的 context,session id 需要通過 URL 明文傳到 AngularJS 頁面中,最終也是導致了 InfoSec team 給我們好多個 tickets,不能搞定這些安全隱患,那么也就影響現在的生產環境
    當然,這里也有其他的問題,比如說導入非常的散亂,控制器(angular controller)也散的到處都是。不過因為業務相對簡單,這種問題還是可以解決的,而且也不是 red flag 🚩,暫時睜一只眼閉一只眼就可以了

鑒于當前的項目也快進入 EOL 了 這種項目提了多少年 EOL 了,什么時候真的 EOL 也不知道,因此當前的目標就是:

  • 最小規模的修改代碼,即不動原有的框架結構、文件路徑等
    這也可以保證不需要動其他的 xml 文件和 pom 文件,復用原本的 build process
  • 順利移除 iframe
    這里最大的問題在于 iframe 和主 xhtml 不分享一個 context,那么,如果可以把原本 iframe 運行的內容,放到 xhtml 中,原本的 session 就可以共享,剩下的生命周期流程也可以交給 java 去管理
  • 直接在 xhtml 文件里運行 angular
    這里其實有蠻多的問題的

項目復刻

首先看一下現在的結構:

這里主要修改的就是 webapp/webapp 下面的內容, app 中的是 angular.html 運行的 controller, lib/angular 下面是 angular 官方的 js 和 css 文檔, index.xhtml 是 entry point, original.xhtml 是使用 iframe 的 copy,大體結構如此

具體的代碼如下:

  • main.controller.js
    這里的代碼比較短,主要內容如下:

    (function () {"use strict";angular.module("demoApp", []).controller("MainController", ["$scope",function ($scope) {$scope.title = "🚀 AngularJS 1.3.17 Demo Page";$scope.userInput = "";$scope.items = ["banana", "apple", "mongo"];$scope.addItem = function () {$scope.items.push("new item " + ($scope.items.length + 1));};},]);
    })();
    

    這個寫過 Angular 的人多多少少會有點眼熟,Angular 的實現——盡管內部完全不同,但是從實用的角度上來說,還是比較相似的:

    • module 就是新建一個 module,后面的 array 與依賴有關,大體對標的是 NgModule
    • controller 對標的大體就是 controller 中的內容,里面的實現大體對標的事 @Component 中的實現
    • $scope 中可以綁定的就是各種的變量和方法
      整體上可以看出來,AngularJS → Angular 雖然實現方法是完全推翻了,但是核心的實現概念還是一致的。2+比起 1 來說更加的類型安全——感謝 TypeScript 帶來的安全感,使用起來也更加的靈活,畢竟:
    • 2+使用的是 TS,而且在編譯時進行變量和方法的校驗;1 則是使用 JS,運行時動態綁定
    • 2+使用的是 class+decorator 的方法;1 使用的是 controller+scope 的方法
    • 2+默認的是單向綁定,雙向綁定需要使用 [(ngModel)];1 默認開啟雙向綁定,沒有什么特別好的選擇
    • 2+模板需要 controller 和 view 進行 MVVM 的交流;1 基本在 HTML 中寫 template
      我個人感覺,小范圍內的項目,1 的寫法可能會更方便一些,但是一代碼量比較大,或者是陌生的代碼,那么 1 找對應的邏輯就比較頭疼
      2+的寫法雖然相對而言更麻煩一點,不過基于 TS 的檢查,以及現代編輯器/IDE 對于 Angular 項目的良好支持,通過查找使用的 reference,和直接點擊變量,在 controller 和 view 層來回切換,查找邏輯反而沒有那么的困難
  • lib
    這里的內容可以從官方文檔里找:https://code.angularjs.org/
    按需下載即可

  • angular.html
    一個簡單的 demo,作為 iframe 的導入對象使用,代碼如下:

    <!DOCTYPE html>
    <html lang="en" ng-app="demoApp"><head><meta charset="UTF-8" /><title>AngularJS 1.3 Demo</title><link rel="stylesheet" href="lib/angular/angular-csp.css" /><script src="lib/angular/angular.js"></script><script src="app/main.controller.js"></script></head><body ng-controller="MainController"><div style="padding: 2em; font-family: sans-serif;"><h1>{{ title }}</h1><p>🔁 double binding Test:</p><inputtype="text"ng-model="userInput"placeholder="Enter something here..."/><p>You have entered: <strong>{{ userInput }}</strong></p><hr /><p>📋 ng-repeat list rendering:</p><ul><li ng-repeat="item in items track by $index">{{ $index + 1 }}. {{ item }}</li></ul><button ng-click="addItem()">Add more item</button><hr /><p>🎯 ng-if:</p><p ng-if="items.length > 3" style="color: green;">Contrags, you have added more than 3 items!</p></div></body>
    </html>
    

    本質上就是一個比較簡單的邏輯,用來確認 AngularJS 的雙向綁定、方法、參數等都能在 View 和 Controller 中來回正常交流

  • original.xhtml
    這里就是比較暴力的檢驗方法了:

    <!DOCTYPE html>
    <htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://xmlns.jcp.org/jsf/html"
    ><h:head><title>Mock JSF App</title></h:head><h:body><h1>Hello from JSF!</h1><iframesrc="angular/angular.html"style="width: 100%; height: 80vh; border: none"></iframe></h:body>
    </html>
    

    通過導入 iframe 確認 html 文件中的內容可以正常的渲染

最終渲染和現實的結果如下:

WildFly 那邊的我就不放了,我已經重新部署了,iframe 的東西是顯示不出來了,除非 revert changes

補充代碼

這里寫了一個小的腳本,因為每次跑完 mvn clean install 都會重新打包 war 和 ear 文件,這也會導致本來的 dorelase 文件被刪除,讓項目沒辦法正常部署,還得重新跑一下 docker 的指令,稍微有點麻煩

#!/bin/bashset -eecho "🧨 Step 1: Shutting down any existing containers..."
docker compose downecho "🔧 Step 2: Building jboss-mock module with Maven..."
cd jboss-mock
mvn clean install
cd ..echo "? Maven build completed. Artifacts generated in: deployments/"WAR_PATH="./deployments/jboss-mock/webapp-1.0.0.war"
if [ -f "$WAR_PATH" ]; thenecho "📦 Detected .war file. Creating .dodeploy marker to trigger JBoss deployment..."touch "${WAR_PATH}.dodeploy"
elseecho "? webapp-1.0.0.war not found! Please check if Maven build succeeded."exit 1
fiecho "🚀 Step 3: Starting container services..."
./start.shecho ""
echo "🎉 Done! You can now visit your app at:"
echo "🔗 http://localhost:8080/webapp-1.0.0/"
echo "🔗 http://localhost:8180/webapp-1.0.0/"

問題定位 & 修復過程

問題定位

其實問題主要出現在這個 <iframe src="angular/angular.html" style="width: 100%; height: 80vh; border: none"></iframe> 這里。前面提到過了,因為 context 沒有辦法共享的關系,所以在我們實際的生產環境,就需要使用 <iframe src="angular/angular.html?sessionId={someJavaMethod()}" style="width: 100%; height: 80vh; border: none"></iframe> 的方法去調用

明文的 session id 主要有這么幾個問題:

  • 容易被截獲,也會被 bookmark
  • 暴露于 iframe,可以被 js 文件讀取
  • 容易引發 XSS 攻擊
  • 無法自動過期

總體來說,我是能理解 InfoSec 為什么會 flag 這個實現的,不過實現起來確實有點頭疼……

修復過程

目前來說找到的實現方法是使用放在 panelGroup 里,讓 AngularJS 在瀏覽器中繼續執行操作,修改的代碼如下:

<!DOCTYPE html>
<htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://xmlns.jcp.org/jsf/html"
><h:head><title>JSF + AngularJS</title><script src="angular/lib/angular/angular.js"></script><script>angular.module("myApp", []).controller("MainCtrl", function ($scope) {$scope.message = "Hello from Angular 1.3!";$scope.items = ["Item A", "Item B", "Item C"];$scope.addItem = function () {$scope.items.push("Item " + ($scope.items.length + 1));};});</script></h:head><h:body><h:panelGroup layout="block"><!-- JSF will ignore {{ }} as long as it's not within EL context --><div ng-app="myApp" ng-controller="MainCtrl"><h2>{{ message }}</h2><input type="text" ng-model="userInput" /><p>You typed: {{ userInput }}</p><ul><li ng-repeat="item in items">{{ item }}</li></ul><button ng-click="addItem()">Add</button></div></h:panelGroup></h:body>
</html>

因為移除了 iframe,所以不會導入 angular.html 了,渲染結果為:


當然,如果要換成動態導入 JS 文件,也是可以實現的:

<!DOCTYPE html>
<htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://xmlns.jcp.org/jsf/html"
><h:head><title>JSF + AngularJS</title><script src="angular/lib/angular/angular.js"></script></h:head><h:body><h:panelGroup layout="block"><!-- JSF will ignore {{ }} as long as it's not within EL context --><script src="angular/app/main.controller.js"></script><div ng-app="demoApp" ng-controller="MainController"><h2>{{ message }}</h2><input type="text" ng-model="userInput" /><p>You typed: {{ userInput }}</p><ul><li ng-repeat="item in items">{{ item }}</li></ul><button ng-click="addItem()">Add</button></div></h:panelGroup></h:body>
</html>

效果如下:

??:我 debug 的時候眼瘸, ng-app="demoApp" ng-controller="MainController 沒有保證一致,所以 debug 的時候搞了好久都失敗,然后重新過了一遍 html 才發現是名字的問題

沒有繼續嘗試的方案

如果還失敗,我打算試試 <h:outputText escape="false" />,這個 tag 可以讓里面的內容不被轉譯。目前來說,上面使用 panelGroup 是夠了,如果實際運行環境中,用 panelGroup 還不行,那么這個就是我最后的救命稻草了……

失敗的嘗試方案

這里也簡單的說一下一些失敗的嘗試方案吧……如果有需求也可以試試看,說不定是我漏了什么……

  • 沒有移除 iframe,但是移除了 session id
    渲染的頁面直接因為沒有 session id 拒絕訪問

  • 沒有用 panelGroup ,直接使用了 HTML tag,但是將 Angular 的所有 attributes 修改為以 data-* 開頭的格式
    這里的想法是 xhtml 的檢查比較嚴格,擔心可能沒辦法認出 customized 的 Angular 屬性,所以導致直接跳過,因此用 data-* 的方法讓 AngularJS 可以識別

    還是沒有辦法解決 JSF 的轉譯問題

小結

目前來說這個方法只是延長一下當前項目的生命周期,作為一個 patch 尚可,作為長期的 solution 就有點力有不怠。真正能夠解決方法的還是停用 JSF——WildFly/JBoss 官方其實已經不推薦繼續用 JSF 了,盡管因為 legacy code 的問題還是繼續提供支持,不過也停止了對 JSF3.0 的原生支持

有條件的話還是得往現在主流的 SPA 遷徙,前端御三家選哪個都行……

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76609.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux文件時間戳詳解:Access、Modify、Change時間的區別與作用

在 Linux 系統中&#xff0c;文件的這三個時間戳&#xff08;Access、Modify、Change&#xff09;分別表示不同的文件狀態變更時間&#xff0c;具體含義如下&#xff1a; 1. Access Time (Access) 含義&#xff1a;文件最后一次被訪問的時間&#xff08;讀取內容或執行&#xf…

SpringBoot項目打包為window安裝包

SpringBoot項目打包為window安裝包 通過jpackage及maven插件的方式將springboot項目打包為exe或msi pom.xml 添加插件 <plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.1.0</vers…

pip永久換鏡像地址

要將 pip 永久設置為阿里云鏡像源&#xff0c;可以通過修改 pip 的全局配置文件來實現。以下是具體步驟&#xff1a; 步驟 1&#xff1a;創建或修改 pip 配置文件 根據你的操作系統&#xff0c;配置文件的路徑略有不同&#xff1a; Linux/macOS 配置文件路徑&#xff1a;~/.…

PI0 Openpi 部署(僅測試虛擬環境)

https://github.com/Physical-Intelligence/openpi/tree/main 我使用4070tisuper, 14900k,完全使用官方默認設置&#xff0c;沒有出現其他問題。 目前只對examples/aloha_sim進行測試&#xff0c;使用docker進行部署, 默認使用pi0_aloha_sim模型(但是文檔上沒找到對應的&…

XAttention

XAttention: Block Sparse Attention with Antidiagonal Scoring 革新Transformer推理的高效注意力機制資源?? ??論文鏈接??&#xff1a;XAttention: Block Sparse Attention with Antidiagonal Scoring ??代碼開源??&#xff1a;GitHub倉庫 XAttention是韓松團隊提…

前端中的浮動、定位與布局

在前端開發中&#xff0c;布局是構建網頁結構的基礎。而浮動&#xff08;float&#xff09;、定位&#xff08;position&#xff09;以及各種布局方法則是實現網頁布局的關鍵工具。 一、浮動&#xff08;Float&#xff09; 浮動是CSS中用于控制元素在頁面中排列方式的一種屬性…

Linux 動、靜態庫的實現

前言&#xff1a;當我們寫了一段代碼實現了一個方法&#xff0c;如果我們不想把方法的實現過程暴露給別人看&#xff0c;可以把代碼打包成一個庫&#xff0c;其中形成后綴為.a的是靜態庫&#xff0c;后綴為.so的為動態庫&#xff1b;當別人想使用你的方法時&#xff0c;把打包好…

ubuntu--字體設置

樣式和字體大小 在終端右鍵-->選擇"Preferences"-->勾選"Custom font": 選擇自己喜歡的樣式&#xff0c;然后通過size滑動條調整字體大小&#xff0c;選擇即可&#xff1a;

Qt核心知識總結

Qt核心知識總結 Qt 是一個功能強大、跨平臺的 C 應用程序開發框架&#xff0c;廣泛應用于圖形用戶界面&#xff08;GUI&#xff09;應用程序的開發&#xff0c;同時也支持非 GUI 應用程序的開發。本文將從入門到精通的角度&#xff0c;詳細解析 Qt 的核心知識點&#xff0c;幫…

Linux 進程概念補充 (自用)

進程概念 內核進程進程狀態內存泄漏進程調度。Linux真實調度算法環境變量 內核 狹義上的操作系統指的是 內核就是進程管理進程調度&#xff0c;文件系統等等。 廣義上的操作系統其實在外殼指令這些。封裝了系統調用的東西。 進程 課本概念程序的一個基本實例 內核觀點&#…

【dify實戰】agent結合deepseek實現基于自然語言的數據庫問答、Echarts可視化展示、Excel報表下載

使用dify agent實現數據庫智能問答&#xff0c;echarts可視化展示&#xff0c;excel報表下載 觀看視頻&#xff0c;您將學會 在dify下如何快速的構建一個agent&#xff0c;來完成數據分析工作&#xff1b;如何在AI的回復中展示可視化的圖表&#xff1b;如何在AI 的回復中加入E…

macos下 ~/.zshrc~ 和 ~/.zshrc

macos下 ~/.zshrc~ 和 ~/.zshrc ~/.zshrc通常是備份文件或臨時文件&#xff0c;可能由編輯器&#xff08;如vim&#xff09;創建&#xff0c;通常可以安全刪除&#xff0c;不會影響系統運行。 在Mac下&#xff0c;這種帶~后綴的備份文件通常是由以下情況產生&#xff1a; 常…

位運算---總結

位運算 基礎 1. & 運算符 : 有 0 就是 0 2. | 運算符 : 有 1 就是 1 3. ^ 運算符 : 相同為0 相異為1 and 無進位相加位運算的優選級 不用在意優先級,能加括號就加括號給一個數 n ,確定它的二進制位中第 x 位是 0 還是 1? 規定: 題中所說的第x位指:int 在32位機器下4個…

Java SpringBoot的自定義配置

一&#xff0c;一個類多個屬性的情況 application.properties配置文件寫法 my.config.ip127.0.0.1 my.config.port8080自定義配置類&#xff1a;MyTestConfig import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties…

Matlab FCM模糊聚類

1、內容簡介 Matlab 211-FCM模糊聚類 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

C++項目 —— 基于多設計模式下的同步異步日志系統(4)(雙緩沖區異步任務處理器(AsyncLooper)設計)

C項目 —— 基于多設計模式下的同步&異步日志系統&#xff08;4&#xff09;&#xff08;雙緩沖區異步任務處理器&#xff08;AsyncLooper&#xff09;設計&#xff09; 異步線程什么是異步線程&#xff1f;C 異步線程簡單例子代碼解釋程序輸出關鍵點總結擴展&#xff1a;使…

C# 使用 BinaryFormatter 和相關類型時的反序列化風險

C# 使用 BinaryFormatter 和相關類型時的反序列化風險 由來&#xff1a;在項目使用.NET Reactor 混淆 C# 的序列化和反序列化發現存在的問題&#xff0c;讀取文件時&#xff0c;轉化為對應的類數據有時候為空&#xff0c;所以就在網上搜索了相關知識&#xff0c;在此做個筆記以…

OpenCv高階(四)——角點檢測

一、角點檢測 在計算機視覺中&#xff0c;角點檢測是識別圖像中局部區域&#xff08;角點&#xff09;的關鍵技術&#xff0c;這些區域通常是兩條或多條邊緣的交點&#xff0c;具有豐富的結構信息&#xff0c;常用于圖像匹配、跟蹤、三維重建等任務。 Harris角點檢測算法是一…

Conda 入門指令教程

Conda 入門指令教程 Conda 是一個強大的包和環境管理工具&#xff0c;廣泛應用于數據科學和機器學習項目中。本文將介紹 Conda 的常用指令&#xff0c;幫助你快速上手。 1. Conda 基礎操作 查看 Conda 版本 conda --version顯示當前安裝的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函數

在寫Unity Shader的過程中&#xff0c;常常需要將方法封裝到HLSL文件中&#xff0c;今天遇到一個這樣的報錯&#xff0c; 明明hlsl文件路徑引用沒問題&#xff0c;卻引用不到方法 并且將分散文件中的函數復制過來一切正常&#xff0c;最終定位到HLSL的預編譯指令中 這指令的…