TechSummary 2025-09-23
· 閱讀時間約 15 分鐘
🚀 使用 GitHub Copilot 代理模式現代化 Java 專案的逐步指南
- GitHub Copilot 代理模式將 Copilot 從被動建議工具轉變為主動協作夥伴,能理解高層次指令並執行多步驟任務,無需詳細指示。
- 搭配 GitHub Copilot 應用現代化 VS Code 擴充功能,此工具組提供互動式、逐步指引,幫助開發者更快、更少錯誤地升級和遷移 Java 專案。
- 現代化流程包括:分析專案、生成升級計畫、自動應用變更、修復建構問題、驗證測試、檢測並修復 CVEs,並提供完整的摘要報告。
- 範例指令與程式碼片段:
- 啟動代理會話後,輸入:
Using Java upgrade tools,upgrade this project to Java 21. Analyze deprecated APIs, update Gradle dependencies, and propose a safe, testable migration plan.
- 程式碼升級前後對比:
// Before (deprecated constructor)
View view = this.resolver.resolveViewName("intro", new Locale("EN"));
// After Java 21 upgrade
View view = this.resolver.resolveViewName("intro", Locale.of("EN"));
- 啟動代理會話後,輸入:
- 此外,它還支援將應用程式遷移到 Azure,進行雲端就緒評估,並將認證從地端遷移到 Microsoft Entra ID。
- 自動化 CVE 掃描是其關鍵安全功能,可智慧地提出安全版本替換或推薦替代函式庫,以維持安全合規。
🔒 我們加固 npm 供應鏈的計畫
Source: https://github.blog/security/supply-chain-security/our-plan-for-a-more-secure-npm-supply-chain/
- 開源軟體是現代軟體產業的基石,但其大規模生態系統也帶來了獨特的漏洞,不斷遭受惡意攻擊者的威脅。
- 近期 npm 註冊中心發生帳戶遭劫持事件,例如 2025 年 9 月 14 日的「Shai-Hulud」蠕蟲攻擊,透過惡意後安裝腳本感染了 500 多個套件。
- GitHub 迅速應對,包括立即從 npm 註冊中心刪除受損套件並阻止上傳包含惡意軟體 IoC 的新套件。
- npm 未來將透過以下措施加強套件發佈安全性:要求本地發佈使用雙因素驗證 (2FA)、提供有限生命週期(七天)的精細權杖,以及推廣信任發佈 (Trusted Publishing)。
- 為支援這些變革,npm 將棄用舊版傳統權杖、將 TOTP 2FA 遷移到基於 FIDO 的 2FA,並預設禁止權杖發佈存取。
- 強烈鼓勵專案盡快採用已在 PyPI、RubyGems、crates.io 和 NuGet 等多個套件管理器中實現的信任發佈功能。
💀 MCP 恐怖故事:本機主機 Drive-By 攻擊漏洞
Source: https://www.docker.com/blog/mpc-horror-stories-cve-2025-49596-local-host-breach/
- CVE-2025-49596 是一個 MCP Inspector 中的關鍵漏洞(CVSS 評分 9.4),將常用的 AI 代理偵錯工具轉變為大規模破壞的武器。
- 攻擊者只需誘騙開發者訪問惡 意網站,即可透過瀏覽器觸發 Drive-by 攻擊,在開發者機器上實現遠端程式碼執行,無需下載或釣魚。
- 問題根源: 傳統 MCP Inspector 設定(例如
npx @modelcontextprotocol/inspector
)將偵錯介面暴露在http://0.0.0.0:6277
,且不帶任何安全控制,允許任何來源的 HTTP 請求。 - 攻擊機制: 惡意 JavaScript 利用瀏覽器對
0.0.0.0
的錯誤處理(將其等同於localhost
)來繞過同源策略,並使用mode: "no-cors"
向http://0.0.0.0:6277/sse
發送請求。一旦控制 MCP Inspector,攻擊者可以注入惡意工具呼叫,竊取憑證、存取私有儲存庫並實現系統妥協。 - Docker MCP Gateway 解決方案: 透過網路隔離架構完全消除此攻擊向量,不暴露本機主機網頁服務,並使用安全的 stdio 傳輸。
- 安全配置範例:
進一步的容器化部署範例:
docker mcp gateway run --transport stdio
docker run -d \
--name mcp-gateway \
--network mcp-isolated \
-p 8811:8811 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v ~/.docker/mcp:/mcp:ro \
--use-api-socket \
docker/mcp-gateway \
--catalog=/mcp/catalogs/docker-mcp.yaml \
--config=/mcp/config.yaml \
--registry=/mcp/registry.yaml \
--tools-config=/mcp/tools.yaml \
--transport=sse \
--port=8811 - 最佳實踐: 立即將 MCP Inspector 升級到 0.14.1+ 版本,部署 Docker MCP Gateway 等安全替代方案,實施網路隔離,要求身份驗證。
🗺️ Ktor 路線圖與預覽
Source: https://blog.jetbrains.com/kotlin/2025/09/ktor-roadmap-2025/
- Ktor 3.3.0 版本已發布 OpenAPI 和 WebRTC 支援的早期預覽。
- Ktor Library Improvement Process (KLIP):Ktor 團隊透過公開的功能提案來徵求社群回饋,以引導開發方向。
- OpenAPI 文件:Ktor 可在編譯時自動從程式碼中生成 OpenAPI 模型,透過新的 Ktor Gradle Plugin 進行配置。
plugins {
kotlin(libs.plugins.kotlin)
alias(libs.plugins.ktor)
}
ktor {
@OptIn(OpenApiPreview::class)
openapi {
target = project.layout.projectDirectory.file("api.json")
title = "My Service"
summary = "What it does"
description = "A longer description of the service"
version = "1.0.0"
// contact, termsOfService, license...
}
}
dependencies {
implementation(libs.ktor.server.core)
implementation(libs.ktor.server.openapi)
} - 服務發現 (Service Discovery):新的 Ktor 插件為 Consul、Kubernetes、Zookeeper、Eureka 等流行的發現機制提供統一的抽象層,支援客戶端和伺服器端發現模式。
install(ServiceDiscovery) {
consul {
connection { host = "localhost"; port = 8500 }
registration { serviceName = "sample-service"; instanceId = "sample-service:$host:$port"; port = 8080 }
}
}
val client = HttpClient {
install(ServiceDiscovery) { consul { connection { host = "localhost"; port = 8500 } } }
}
client.get("service://sample-service") - WebRTC 支援:旨在提供統一的多平台 API,支援瀏覽器、Android,未來計畫擴展到 JVM、iOS 和 Native 平台,也考慮支援基於 Rust 的 WebRTC 客戶端。
val jsClient = WebRtcClient(JsWebRtc) {
defaultConnectionConfig = { iceServers = listOf(WebRtc.IceServer("stun:stun.l.google.com:19302")) }
}
val jsConnection = jsClient.createPeerConnection()
jsConnection.dataChannelEvents.collect { event ->
when (event) {
is Open -> println("Another peer opened a chanel: ${event.channel}")
is Closed -> println("Data channel is closed")
is Closing, is BufferedAmountLow, is Error -> println(event)
}
} - gRPC:透過
kotlinx-rpc
函式庫為 Ktor 帶來 gRPC 支援,可以從 Kotlin 介面或.proto
文件定義服務。@Grpc
interface GrpcService {
suspend fun sayHello(request: HelloRequest): HelloResponse
}
fun Application.installGrpc() = grpc {
registerService<MyService> { MyServiceImpl() }
} - Koog 整合:新的 Ktor Koog 插件使開發者能夠輕鬆使用 Ktor 和 Koog 創建代理服務。
- 依賴注入 (Dependency Injection):計畫透過編譯器插件進一步增強依賴注入支援,提供編譯時驗證並更好地支援其他平台。
✨ 從 AI 生成到生產就緒程式碼:WebStorm 重構工具實現現代化工作流程
- 雖然 AI 擅長快速生成功能性程式碼,但將其轉化為可維護、生產就緒的程式碼,是 WebStorm 重構工具的關鍵作用。
- 步驟 1:為內聯類型提取類型別名:將內聯類型定義自動轉換為介面,提高可讀性和可重用性。
interface AnalyticsData {
totalUsers: number;
previousTotalUsers: number;
revenue: number;
previousRevenue: number;
pageViews: number;
previousPageViews: number;
conversionRate: number;
previousConversionRate: number;
recentActivity: RecentActivity[];
}
const [analyticsData, setAnalyticsData] = useState<AnalyticsData | null>(null); - 步驟 2:重新命名以提高清晰度:使用 Shift+F6 智能重新命名變數(例如
data
改為analyticsData
),WebStorm 會自動更新所有引用。 - 步驟 3:提取可重用組件:將重複的 JSX 模式提取為獨立組件,WebStorm 會自動識別並生成其 props。
- 步驟 4:新增 Props 以提高可重用性:利用 Alt+Enter 快速修復,自動將新的 prop 添加到組件介面中,確保一致性。
- 步驟 5:使用錯誤邊界和載入狀態包圍:使用 Ctrl+Alt+T/⌥+⌘+T 將內容包圍在錯誤處理(例如
<ErrorBoundary>
)或條件邏輯中。 - 步驟 6:智能字串重構:WebStorm 會自動將字串拼接轉換為模板字串,提高可讀性。
// Before
return months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear();
// After (automatic conversion)
return `${months[date.getMonth()]}/${date.getDate()}/${date.getFullYear()}`; - 結論:AI 負責快速原型開發,WebStorm 負責確定性、安全且全面的重構,兩者結合可實現速度與品質的最佳平衡。