編輯 | 究查 | 歷程 | 原始

安全傳輸與 API 通訊模組 (Transport Manager) 深度分析

CB_IMGPSScanImp.pas 中,「安全傳輸與 API 通訊模組」負責處理 ActiveX 客戶端與後端伺服器 (如 Java Servlet 平台) 之間的所有資料交換與檔案傳輸。由於涉及機敏的金融/保險文件,此模組高度依賴加密與安全通訊協定。

若要將此模組進一步細拆,其內部組成可分為以下四大子分類:


1. HTTP/HTTPS API 請求管理器 (RESTful / Servlet Client Wrapper)

職責:專責透過 HTTP(S) 協定,向後端的 Java Servlet 端點發送 GET/POST 請求,用於同步時間、下載設定檔或回報案件狀態。
核心實作特性
* 套件依賴:底層依賴 SecureBlackbox 的 TElHTTPSClient (在變數宣告為 HTTPSClient) 處理 SSL/TLS 連線。
* 字串/表單資料交換
* ProcessServlet_Get:使用 HTTP GET 方式,將加密過的參數 (SendData) 送至伺服器,並將伺服器回傳的結果寫入 FReWriteMemo1 中。
* ProcessServlet / ProcessServlet_FormData:使用 HTTP POST 或 multipart/form-data 方式提交較大的資料集(如 OMR 檢核結果、案件完成通知等)。
* 狀態與錯誤攔截:檢查伺服器回傳的代碼(例如回傳 0 代表成功,1 代表錯誤,或攔截回傳 HTML 中包含 login.js 來判斷 Session 是否逾時登出)。

2. 雙協定檔案上傳/下載引擎 (Dual-Protocol File Transfer Engine)

職責:處理實體影像檔案(通常是打包後的 ZIP 檔)或系統授權檔的實體傳輸,並根據系統設定動態切換 HTTP 或 FTP 協定。
核心實作特性
* HTTP 檔案傳輸
* upFile:透過 HTTP POST (multipart/form-data) 將本地端的檔案 (如 Img.zip.lic 檔) 上傳至伺服器指定的 Servlet 接收端。
* dnFile_Get / dnFile:透過 HTTP 協定從伺服器下載檔案 (如 OMRSet.zip, KeyinSet.zip 或舊案影像),並提供下載狀態監控。
* FTPS 檔案傳輸 (高頻寬/大檔專用)
* GetftpInfo:先透過 HTTP 向伺服器查詢該案件是否應使用 FTP 傳輸,並取回加密的 FTP 登入資訊。
* 依賴 SecureBlackbox 的 TElSimpleFTPSClient 建立 FTP over SSL 連線。
* SetFtpInfoIIS_Ftp.FtpsConnectIIS_Ftp.FtpsToMainIIS_Ftp.FtpsDownloadFile:負責實際的 FTP 登入、切換目錄、上傳與下載操作,完成後呼叫 FtpCaseComplete 透過 HTTP 通知伺服器傳檔結束。

3. 安全加密與雜湊模組 (Security, Crypto & Hashing Utils)

職責:負責資料傳輸前後的加解密運算,以及檔案完整性的 MD5 校驗,確保通訊過程不被竄改。
核心實作特性
* 字串加解密 (String Encryption)
* 利用 En_DecryptionStr_Base64 函式(可能來自自訂或第三方的 Encryp 單元),對 URL 參數 (如 checktime, col 欄位清單) 進行加解密,避免敏感資訊在 URL 明文中裸奔。
* 解析加密過的 FTP 登入資訊字串。
* 檔案 MD5 雜湊校驗 (File Hashing)
* 使用 Indy 的 TIdHashMessageDigest5 元件。
* LoadFileGetMD5:讀取本機影像檔並計算其 MD5 值,用於比對「異動件 (ESCAN)」模式下,檔案是否與伺服器原有的版本一致,防止誤刪或重複傳輸。
* 憑證管理 (Certificate Management)
* HTTPSClientCertificateValidate:處理 X.509 憑證驗證事件,通常設定為 Validate := True 以略過嚴格的自簽憑證檢查(在內部封閉網路中常見的做法)。

4. 傳輸前置準備與封裝器 (Payload Archiver & Preparer)

職責:在真正啟動傳輸前,將硬碟上散落的 TIFF/JPG 檔案、.dat 索引檔以及 .ini 設定檔,打包成單一的封裝檔以利傳輸。
核心實作特性
* ZIP 壓縮封裝
* 依賴 TVCLZip (VCLZip 模組)。
* ZipMainFile:讀取 Context.dat 等清單,將案件目錄下的所有影像與關聯的索引文字檔打包成 Img.zip
* 包含檔案大小檢核邏輯:在打包完成後,檢查 ZIP 檔是否超過伺服器允許的上限 (FMaxUploadSize),若超過則阻擋上傳。
* ZIP 解壓縮處理
* 依賴 VCLUnZip 模組。
* ExecuteUnZip / ExecuteUnZip_Pwd:將從伺服器下載回來的 OMRSet.zipKeyinSet.zip 或舊案件影像壓縮檔解壓縮至指定的工作目錄中,並支援帶密碼的解壓縮。


💡 未來重構與微服務化建議

針對「安全傳輸與 API 通訊模組」,若未來系統架構演進,建議考量以下重構方向:

  1. 統一且標準化的 HTTP Client (捨棄舊版第三方庫)
    早期的 SecureBlackbox 雖然強大,但現代的開發環境 (如新版 Delphi 或 C#/Java/Node.js) 均已內建完善且高效的 HttpClient。建議將所有的 API 呼叫標準化為 RESTful API (JSON 格式),並使用原生的網路庫。
  2. 廢除 FTP,全面改用 HTTP(S) 分塊上傳 (Chunked Upload)
    目前系統需動態切換 HTTP 與 FTPS,增加了防火牆設定 (Port 21, Passive Ports) 與除錯的困難度。現代系統處理大檔上傳,主流做法是透過 HTTP/HTTPS 的 分塊上傳 (Chunked Upload / Multipart) 搭配斷點續傳機制,建議未來可逐步汰除 FTP 傳輸路徑。
  3. 非同步與背景傳輸 (Asynchronous Transfer)
    目前上傳時會透過 DataLoading 鎖死整個 UI (Screen.Cursor := -11),使用者必須枯等上傳完成。重構時應將 Transport Manager 放入獨立的 Thread 或背景 Service 中執行,並透過回呼 (Callback) 或事件 (Event) 更新進度條,提升使用者體驗。
  4. Token-based 授權取代自訂加密
    目前依賴自訂的 En_DecryptionStr_Base64 在 URL 傳遞加密字串作為安全驗證。建議未來升級為標準的 OAuth 2.0 (JWT Token) 放在 HTTP Header 中進行授權,更加安全且符合現代 Web 規範。