vibe coding 常見的六個資安問題




昨天晚上是 trAIgon AI 小聚的第四場。這次的題目是講給沒有工程背景的人聽的:你用 AI 做出來的東西要上線之前,有哪些地方會出事。
現場我問了一句「有沒有人已經在用 AI 開發產品」,大部分人都舉了手。
做出來的那一刻感覺很完整,你會很自然地以為已經結束了。
這六件事沒有一件需要你看得懂程式碼。每一條都可以直接丟給 AI,叫它去查自己寫出來的東西。
這篇分享:昨天簡報的完整六條、其中幾條可以怎麼自己驗一次,還有我為什麼覺得第五條最防不勝防。
先給六條清單
- 金鑰不要寫死在程式碼裡,也不要寫進 Git,不然別人拿得到。萬一真的流出去了,第一件事是去撤銷,不要想著救回來。
- 自己註冊兩個帳號互相撈對方的資料,看 A 能不能看到 B 的。
- 前端算出來的數字,使用者都改得掉。要算的東西放後端。
- 輸入欄位收到的不一定是你想像的東西。
- 別人的 skill 跟套件,裝之前先掃過、先查來源,能不裝就不裝。
- agent 的權限只給到這個專案那一層。
下面一條一條展開。
金鑰外流,第一件事是撤銷不是補救
金鑰(API key,服務用來認得你的一串字)一旦流出去,就當它已經沒救了。不要花時間想辦法把它收回來——沒有這種東西。第一件事是去原廠把那把金鑰撤銷掉,再換一把新的。別人拿著它做的每一件事,帳都是記在你頭上。
昨天現場提到一個例子:某位創作者把自己做的產圖服務分享出去,說大家可以貼自己的金鑰進來用。看起來是這樣,但程式底下跑的其實是他寫死的那一把。所有人都在燒他的額度,最後他收到一張上萬元的帳單。
所以金鑰不要寫死在程式碼裡,也不要寫進 Git(程式的版本紀錄)。Git 只要進去過一次,後來拿掉也沒用,翻版本歷史一樣拿得到。
還有一句我昨天特別強調的:現在大部分人的程式是 AI 幫你寫的,你自己看不到那把金鑰在哪,不代表別人看不到。對方可能比你更清楚你的程式怎麼運作。
自己註冊兩個帳號互相撈對方的資料
如果你的服務會讓人登入,那登入之後每個人理論上只看得到自己的資料。這件事要靠服務每一次都去驗證「現在這個人是誰」,不是靠畫面上沒有那個按鈕。
最快的方法就是自己開兩個帳號。用 A 登入,看得到自己的訂單,網址長那個樣子——然後把網址後面那串編號直接改掉。如果你就這樣看到了 B 的訂單,權限控管就是壞的。
這是 vibe coding(跟 AI 邊聊邊把東西做出來)出來的專案最常見的一個洞,因為 AI 很容易照著「畫面上要顯示什麼」去寫,而不是照著「這個人有沒有資格看」去寫。
你不一定要自己動手。知道有這件事存在就夠了,剩下的可以叫 AI 幫你查一遍。
前端(使用者瀏覽器那一端)的東西一律當作不可信
假設你給使用者一些免費額度,前十次免費、或是前十分鐘免費。如果這個次數跟時間是在網頁那一層算的,那就是使用者說了算。
他可以跟你的後端說他只用了一分鐘,實際上已經用了三小時。然後你就一直在幫他付錢,帳單照樣是你的。
真的要算的東西放後端,也就是使用者碰不到的那一端。預設從前端送過來的每一個數字都是假的,然後自己建一套機制去驗證。
輸入欄位收到的不一定是你想像的東西
輸入欄位是同一件事的另一面。你以為搜尋欄會收到中文或英文,但有人會直接貼一段程式碼進去。如果你的後端照單全收拿去執行,他要什麼資料就撈什麼資料——使用者名單、信用卡資訊都有可能。這個叫 SQL injection(SQL 注入)。以前那種班級網頁最容易測出這個。
重點不是你會不會自己防,是你得先知道有這種人存在,才防得到。
你裝的每一個東西,都是在信任一個陌生人
這是我覺得最防不勝防的一條。
現在很多人看到社群在傳什麼 skill(別人寫好、掛給 AI 用的一份說明和腳本)就直接裝,我覺得這件事非常恐怖,因為你完全不知道那裡面寫了什麼。skill 本來就鼓勵你把腳本放進去,而那個腳本除非你自己看得懂,不然就跟撿到一支隨身碟直接插進電腦沒兩樣——這件事我們很早以前就知道不能做了。
我自己的做法有三步:裝之前先讓 AI 在本機掃一次,問它有沒有常見的攻擊手法、有沒有在偷做什麼、有沒有藏刻意寫到看不懂的程式碼;再來查來源,確認這真的是大家在傳的那一個,而不是名字取得很像、其實根本沒什麼人用的仿冒品;能不裝的就不要裝。
套件更難防。我們現在寫的東西都是疊在一層又一層的套件上面,像積木。你想要的是一座城堡,但這座城堡不是你一磚一瓦自己砌的,是各路人馬做好的零件疊起來的。常見的手法有兩種:一種是找一個已經沒人在維護的套件,偷偷加幾行進去;另一種是直接把維護者的帳號盜走——今年幾個出名的案子都是後者,被下手的反而是最多人在用、還在更新的套件。你之前的版本都好好的,升一個小版本就中招。所以能不升版就不升版,除非這個版本有明顯的已知問題。現在每升一次版都要重新查一遍,成本實在太高了。
同一個晚上還有一個更直接的例子。有人分享了中轉 API 的用法——中間有一個站幫你共享一大批帳號的額度,邏輯有點像共享單車,你騎完換下一個人騎。他說自己原本的用量大概要台幣九千,走中轉大概一千五就夠了。但他自己也講得很清楚:這不安全。你的金鑰是從那個站過的,它想側錄就側錄得到,有些中轉站的商業模式本來就包含把敏感資料拿去賣,而且它哪天收錢跑路你也攔不住。我自己是不敢用。
權限全開,跟權限管太嚴,結果差不多
現在大家跑 agent(會自己動手做事、不只是回話的 AI)基本上權限都直接全開,因為這樣最方便。
有趣的是另一邊也不會比較好。如果權限不給到那麼高,它就會三不五時跳出來問你一次,而如果你看不懂它在問什麼、每次都按允許,那其實就跟全開沒有兩樣。這件事不是靠「我會仔細看」解決的。
所以能做的是把它會波及到的範圍先框住。一種是讓它跑在虛擬機裡面,至少壞掉的不是你整台電腦。另一種是只給這個專案的範圍——你在 vibe coding 的時候本來就不需要整台電腦的權限,給越多,就是把越多東西交到一個工具手上,而你根本不知道它下一步會做什麼。
本機跑得起來,不等於可以上線
你自己測的時候,走的永遠是最順的那條路,我們叫 happy case。因為你知道這個東西該怎麼用,你就不會去用錯。
丟到市場上不是這樣。會有人用各種稀奇古怪的方式來玩你的服務,有些是好奇,有些是故意。
所以「東西做出來了」跟「東西可以上線了」中間還有一大段距離。
而這一段你一樣不用自己扛。知道有這回事之後,直接問 AI:有哪些操作可能會讓這個服務出問題。它答得出來,只是你不問它不會主動講。
下一場是 10/6(二)晚上七點的第五場,題目是 Jev——就是 Day 264、265 寫的那個只會做選擇題跟是非題的分類器。地點在台北松山的紅球攝影,酌收 NT$200,報名要審核,連結放在最下面。
別人不會照你想的方式用你的東西。
trAIgon v5|Jev(10/6 19:00,台北松山 紅球攝影,NT$200,報名需審核):https://luma.com/uszrbqpk Day 241 skill 不是裝越多越好(第二場小聚的現場整理):https://www.dawsonwang.com/day/241 Day 251 最好的題目藏在抱怨裡(第三場小聚的預告):https://www.dawsonwang.com/day/251 Day 264 什麼是 Jev?為什麼我覺得它過譽了?:https://www.dawsonwang.com/day/264 Day 265 Laya vs Jev 兩個 AI 互打,換台電腦就翻盤:https://www.dawsonwang.com/day/265