
(端起茶杯,看著天邊那一抹如晚霞暮紫般絢爛的餘暉,輕輕搖了搖身下這把老舊的藤椅深棕)。
大孫女、小孫女,快過來,別在院子裡跑得滿頭大汗了,來爺爺身邊坐下。喝口剛倒好的琥珀熱茶,爺爺用我這白髮銀霜腦袋瓜裡裝的老故事,繼續給你們講講咱們昨天還沒說完的「輕竹籃」。
昨天啊,我們聊到怎麼用 Tauri 打造超輕量的跨平台桌面程式。看著大孫女聽得津津有味、小孫女在旁邊拉著爺爺的衣角撒嬌,爺爺心裡真是高興。今天,我們緊接著進入 Day 20:Tauri v2 的安全哲學:能力模型(Capability)與自訂無邊框 UI。
這堂課啊,用爺爺大半輩子的生活智慧來講,就是 「如何給精緻的竹編籃裝上一把既牢固又靈巧的銅鎖,同時把它雕琢得像宮廷裡一樣雅致」。
大孫女,妳平時用電腦時可能沒想過,這桌面軟體因為是在本機電腦執行,所以擁有極高的權限。它能隨意讀寫妳的硬碟檔案、執行系統命令,甚至能控制整個作業系統。
現在很多年輕人喜歡用網頁技術(HTML/JS)來做介面。但網頁這個東西啊,就像一扇精美的雕花玻璃窗,雖然好看,但也容易被壞人盯上。如果妳寫的前端網頁不小心被植入了惡意腳本(也就是大家常說的跨站腳本攻擊 XSS),而在傳統的桌面架構下,這個惡意腳本就等於直接繼承了系統的高權限!這下可糟了,駭客能直接透過這個漏洞,把妳整台電腦的隱私檔案偷得精光,整個系統瞬間就會被外人給控制了。
這就像是,妳把自家的圍牆造得又高又結實,卻在玻璃窗上留了一個大洞,還把保險箱的鑰匙掛在窗邊一樣危險。所以,我們必須要有一套萬無一失的保全規矩。
在 Tauri v2 的世界裡,它為了防範這種危機,設計了一套非常嚴格且聰明的防禦機制,這就是爺爺想跟你們說的兩個核心工藝:
Tauri v2 引入了非常嚴格的權限防禦機制。這個機制叫做 Capability(能力模型)。
爺爺常說,治家要有規矩。如果家裡來了幫忙炊煮的臨時工,我們只會給他廚房的鑰匙,絕對不會連書房、保險箱的鑰匙也一併塞給他,這就是「最小權限原則」。
capabilities/*.json(能力設定檔)中,明確宣告前端介面可以調用哪些 Rust 後端指令。$DOCUMENT(文件夾)或 $APPDATA(應用程式資料夾)裡的特定格式檔案」,而且嚴禁使用像 fs:allow-all 這種貪圖方便、把所有權限都打開的寬鬆設定。現代的軟體,大家都講求「高質感、無邊框」的精緻視覺。為了打造出這種現代化界面,我們通常會在設定檔中把 decorations 設為 false。這樣一來,作業系統內建那種厚重、呆板的視窗外框與標題列就會被隱藏起來。
但是,一旦把這個外框拿掉,大孫女妳就會發現: 視窗動不了了! 因為原生視窗用來拖曳移動、最小化、最大化與關閉的控制按鈕,全部跟著那個框一起消失了。這時候,我們就必須自己動手:
不過啊,大孫女,在做這個自訂無邊框 UI 的時候,許多年輕人都踩過同一個大坑。爺爺在這裡給妳指條明路,免得妳到時候折騰半天:
為了讓使用者能拖曳整個視窗,我們會把自訂標題列的整個網頁區域設定為「可拖曳區域」(這在 Tauri 裡通常是加上 data-tauri-drag-region 屬性)。
這時候問題來了: 如果妳在這個拖曳區域裡面,放了其他可以點擊的按鈕或搜尋框,使用者會發現這些按鈕「完全點不到」! 因為每當使用者的滑鼠點下去時,系統會以為使用者是要「拖曳移動視窗」,這個拖曳事件會直接把點擊事件給拦截、吃掉。
【爺爺的避坑對策】:
當妳需要在標題列放搜尋框或功能按鈕時,一定要在這些可點擊的 HTML 元素上,加上特定的類名排除拖曳,或者在 JS 裡面寫上 stopPropagation() 阻止事件冒泡。這樣一來,網頁才會知道:「這裡不能拿來拖視窗,這是要讓我點擊用的!」這樣按鈕才能重新恢復正常運作。
(天色漸漸暗了,院子裡的晚風吹過,茶香也愈發濃郁。寫程式、做軟體啊,就跟爺爺編一輩子竹籃是一樣的道理,外表要雕琢得優雅現代,內在的骨架與防護更要踏實穩固。)