維運剛產生一條資料庫密碼,點複製,切到終端機貼上——這半分鐘裡,密碼同時存在於產生頁、系統剪貼簿,以及你接下來可能開啟的每一個輸入框。很多人只核對了前半段:產生有沒有上傳。另一篇寫過怎麼用 Network 核對明文沒有離開瀏覽器。後半段經常被跳過:複製成功之後,還有誰能讀到這塊緩衝區。

本文不講怎麼產生高強度或可讀密碼,也不把「複製」寫成產品功能清單。問題只有一個:密碼進了剪貼簿之後,還會被哪幾類程式讀走。MyPassGen 的複製按鈕呼叫的是 navigator.clipboard.writeText,把字串寫進系統剪貼簿;站內沒有密碼庫,關閉分頁後伺服器上不會留下這條密碼。剪貼簿卻是作業系統的共用區,頁面關了它還在。下面用規範、系統設定和能當場做的步驟把路徑拆開。

先做一次分流

能交給密碼管理器自動填入,就不要複製。必須複製時,只用一條不會上真實帳戶的測試密碼做下面的核對;貼上成功後立刻再複製一個無意義字元覆蓋。要傳給遠端同事時,走閱後即焚,而不是把明文長時間留在剪貼簿或 LINE 群裡。

複製完成,秘密已經離開頁面

產生頁上的輸入框屬於目前分頁。剪貼簿不屬於任何分頁。MDN 把 Clipboard API 寫成「非同步讀寫系統剪貼簿」:寫入成功後,記事本、終端機、聊天視窗、遠端桌面,都能依各自的規則去讀。HTTPS 只保護產生頁到伺服器的那條連線;它不保護你本機上的這塊緩衝區。

舊介面 document.execCommand('copy') 已被標成不建議使用,實作也不一致。新頁面應使用 navigator.clipboard.writeText。這個寫入本身通常不跳出「是否允許讀取」——Chromium 把 clipboard-write 視為可自動授予的寫入權限,Firefox 與 Safari 則要求最近有過一次使用者手勢(點按鈕、按鍵),也就是規範裡的瞬時啟動。你點「複製」滿足手勢;腳本在背景默默寫,在 Safari 上常會失敗。這解釋了「為什麼有的頁必須點一下才能複製」,不是網站在刁難。

MyPassGen 密碼產生、閱後即焚連結、清洗結果的複製,都走同一條 writeText。開啟即用,無需註冊。複製成功只證明字串進了系統剪貼簿,不證明它幾秒後會被誰讀走,也不證明它不會出現在 Win+V 的歷程清單裡。把「已複製」四個字當成安全終點,漏掉的就是後面幾條路徑。

網頁讀取:權限和貼上事件

網頁想主動讀剪貼簿,走的是 navigator.clipboard.readText() 或 read()。規範要求安全內容環境(HTTPS 或 localhost),並希望讀取發生在使用者剛剛操作過頁面之後。瀏覽器落地並不統一,這正好可以當場試。

Chromium:clipboard-read 權限

Chrome、Edge 等在文件有焦點、但讀取並不完全符合規範時,會申請 Permissions API 裡的 clipboard-read。你點「允許」之後,權限會留下來:同一來源的腳本以後可以再讀,不必每次都彈窗。網站設定裡可以查到「剪貼簿」,也能撤回。嵌在別人頁面裡的 iframe 還要過 Permissions-Policy 的 clipboard-read / clipboard-write,父頁沒放行,子頁呼叫介面會失敗。這是可以在開發者工具 Application → Permissions 裡核對的事實,不是口號。

Firefox 與 Safari:暫時貼上選單

Firefox 和 Safari 不打算實作這個持久權限。讀取時若不符合規範、但仍有瞬時啟動,會跳出一個短暫的內容選單,只有一項「貼上」,大約一秒後才可點。同源內容有時可免這一步;跨來源內容一般不能免。你沒有點那一項,腳本拿不到文字。和 Chromium「允許一次、以後還能讀」不是同一套模型。

你自己貼上時:頁面必然能讀到

按 Ctrl+V / Cmd+V,或點輸入框的「貼上」,會觸發 paste 事件。處理函式可以從 clipboardData 取出文字——這是你主動交給目前頁面的,不是背景偷讀。風險在於:焦點在 LINE、工單回覆欄或錯誤的瀏覽器設定頁時,手比眼睛快。剪貼簿不會問「你是不是要貼密碼」。

手機上還有另一層。iOS 14 起,應用程式在背景讀取剪貼簿時會在頂部閃一條橫幅。iOS 16 起,應用程式若不用系統貼上選單、快速鍵或 UIPasteControl,而是直接讀 UIPasteboard,系統會先問「是否允許貼上」。橫幅和彈窗證明「有人在讀」,不能證明「沒有人讀過」——你沒看見,只說明這次沒觸發,或你點過允許。

不要把剛複製的密碼再貼進會上傳原文的檢測頁

有的「密碼外洩查詢」會把密碼原文 POST 出去。剪貼簿外洩是本機路徑;貼進會上傳的網站是另一條出站路徑。差別見本機對照外洩名單,和全網密碼查詢差在哪。本機檢測只下載公開弱密碼名單,待測密碼留在輸入框。產生和檢測都開啟即用,無需註冊。

系統歷程和雲端同步

網頁權限只涵蓋「目前分頁的腳本」。作業系統自己還維護一份歷程,並且可能同步到別的裝置。這兩條不經過 clipboard-read 彈窗。

Windows 10 / 11 開啟剪貼簿歷程記錄後,用 Win+V 能看到最近複製的項目。微軟說明:最多25 筆;未釘選的項目在重新開機後清空,釘選的會留下。設定裡還可以開啟「跨裝置同步」:同一 Microsoft 帳戶登入的電腦之間同步文字。密碼一旦進了歷程,坐在這台電腦前的人、以及同步目標裝置上的人,都能在面板裡看見明文。釘選尤其危險:重新開機也清不掉。

蘋果的通用剪貼簿走接力(Handoff):裝置靠近、同一 Apple 帳號、藍牙和 Wi-Fi 開啟、接力開啟(預設開)。在一部裝置上複製,附近另一部可以貼上;內容只留一小段時間,或直到任一側複製了新內容。Apple 安全指南寫得更直:應用程式可以在使用者尚未貼上時就存取剪貼簿資料;開了通用剪貼簿之後,這種存取會延伸到同一 iCloud 帳號下的其他裝置。加密用的是與接力相同的通道(BLE 4.2 配對、256 位元 AES 金鑰、廣播用 AES-256-GCM),防的是路人竊聽,不是「旁邊那部已登入的 iPhone 讀不到」。

密碼管理器承認剪貼簿是短暫暴露時段。1Password 預設約 90 秒後清除複製內容,可在安全設定裡關掉。Bitwarden 在桌面端、行動端和瀏覽器擴充功能裡提供「清除剪貼簿」,間隔從約 10 秒到 5 分鐘,也可以設為從不。瀏覽器裡的產生頁通常不會替你做這件事:MyPassGen 複製成功後不會倒數清空。覆蓋要靠你自己再複製別的東西,或用系統面板清除。

遠端桌面、擴充功能和誤貼

遠端桌面、VNC、許多會議軟體預設把剪貼簿雙向重新導向:你在遠端工作階段裡複製,本機也能貼;本機複製,對端也能貼。密碼會同時出現在兩台機器的緩衝區裡。共享螢幕時,終端機裡剛貼上去的字元還可能被會議錄影或截圖留下。這和「網頁有沒有上傳」是不同的層,Network 面板看不見。

瀏覽器擴充功能若申請了 clipboardRead / clipboardWrite(或 Chromium 的對應主機權限),可以在頁面腳本的權限模型之外讀寫剪貼簿。擴充功能商店的權限清單能核對;裝了「剪貼簿增強」「跨裝置貼上」類擴充功能,等於又開了一條同步通道。不要只看產生頁有沒有上傳,也要看擴充功能清單。

最常見、也最容易當場重現的,仍是誤貼:焦點在 LINE、郵件本文或工單回覆裡,手指按了貼上。聊天紀錄、郵件封存、工單系統會把明文留下,保存時間遠長於剪貼簿的 90 秒。一次性把密碼交給遠端同事時,應走閱後即焚:金鑰放在網址的 # 後面,閱讀頁無需登入;不要把同一條明文既複製進剪貼簿,又貼進群組。

對照表:五條外洩路徑

同一條剛複製的測試密碼,至少能分成五條路徑。差別不在演算法名稱,而在誰能讀、你能不能當場看見。

路徑 誰能讀 你怎麼當場看見
網頁 readText() 拿到讀取權限或通過貼上選單的來源 Chromium 權限彈窗;Firefox / Safari 的貼上項目
你自己的貼上 目前焦點所在的頁面或應用程式 輸入框裡出現明文;paste 事件
系統歷程 / 雲端同步 本機使用者;同步目標裝置 Win+V;另一部 Apple 裝置上的貼上
遠端桌面 / 會議 兩端工作階段、錄影、截圖 對端記事本能否貼出;會議回放
擴充功能與管理器 宣告了剪貼簿權限的擴充功能 擴充功能權限頁;管理器是否在 N 秒後清空

產生頁用 Web Crypto 算出隨機字串、並且 Network 裡沒有密碼正文,只關掉了「上傳」這一條。上表另外四條仍然開著。能交給管理器自動填入時,根本不必經過剪貼簿;必須手打或必須複製時,把暴露時段壓到「貼完立刻覆蓋」這一步。

當場核對

下面這組步驟不依賴任何品牌承諾。用一條不會用於真實帳戶的密碼做,例如產生器預設 16 碼隨機字串。不要拿正在用的主密碼練手。

  1. 開啟產生頁,產生一條測試密碼,點複製。不要用於登入。打開開發者工具 Network,勾選「保留記錄」,確認複製動作之後請求主體和分析事件裡沒有這串字元。核對上傳的方法見瀏覽器裡做加密,怎麼當場核對明文沒有上傳。
  2. 開啟記事本或任意文字框,貼上一次,確認剪貼簿裡就是剛才那串。再複製一個單一字元 x,再貼一次:應變成 x,說明覆蓋生效。
  3. 若在 Windows 且已開啟剪貼簿歷程記錄,按 Win+V。歷程裡應能看到剛才的測試密碼;若已覆蓋,最新一筆應是 x,密碼可能還留在更下面。不要點釘選。用「全部清除」或繼續複製無意義文字,直到清單裡看不見密碼。
  4. 開啟一個空白分頁的主控台,執行 navigator.clipboard.readText().then(console.log, console.error)。Chromium 應跳出讀取權限或失敗;Firefox / Safari 應出現貼上項目或拒絕。不要點「允許」來「方便除錯」——允許等於給這個來源留下持久讀取權。
  5. 有第二部登入了同一 Apple 帳號或 Microsoft 帳戶、並開啟了同步的裝置時,在那部裝置上貼上。若貼出測試密碼,說明雲端同步或通用剪貼簿已把明文送過去。關同步、關接力,或等它逾時後再試一次。
  6. 看已裝擴充功能的權限清單,有沒有剪貼簿讀寫。遠端桌面若開著,在對端記事本裡試一次貼上,確認重新導向是否開啟。

MyPassGen 的密碼產生器按這個邊界工作:隨機模式 6–128 碼,預設 16,低於 8 碼會提示較弱;兩種模式都用 getRandomValues 在目前分頁抽取;複製走 writeText。開啟即用,無帳號、無密碼庫。你要核對的是權限彈窗、Win+V 和另一部裝置上的貼上,不是頁面上的「已複製」。

貼上之後怎麼收尾

今天必須複製的那一條,按這條順序收尾:先確認焦點在正確的密碼框,再貼上;立刻複製一個無意義字元或用系統面板清除歷程;需要傳給別人時,改走閱後即焚,金鑰放在 # 後面,不要把明文再留在剪貼簿當「備份」。能改用管理器自動填入的帳戶,把複製從流程裡刪掉。

共用電腦、展示機、開著遠端桌面的維運跳板,預設當作「剪貼簿會被第二個人讀」。這些環境上不要複製主密碼。必須手打時,用更長的可讀密碼降低打錯率,並在用完後改掉——四個單字在 100 詞表上大約只有 27 bits,不夠當主密碼,對照見隨機密碼和可讀密碼該怎麼選。

做完「貼完覆蓋」和「不要點允許讀取」,你就已經能回答本文的問題:複製之後誰還能讀,取決於網頁權限、系統歷程、雲端同步、遠端工作階段和你自己的下一次貼上。產生頁不上傳,只說明伺服器紀錄裡沒有這串字元,並不收回作業系統已經發出去的那一份。

常見問題

HTTPS 是不是已經保證複製後的密碼安全?

不是。HTTPS 保護的是瀏覽器到伺服器的傳輸。剪貼簿在本機,不走這條 TLS。網頁上傳、系統歷程、通用剪貼簿和誤貼,都不看網址列有沒有鎖頭圖示。

點了「允許讀取剪貼簿」,以後還能撤回嗎?

在 Chromium 可以:網站設定 → 權限 → 剪貼簿,改為封鎖。Firefox 與 Safari 通常不把這次讀取記成持久權限,下一次仍要經過貼上項目。不要為了少點一次就給不信任的來源開讀取權。

產生密碼需要註冊嗎?複製會不會上傳?

不需要註冊。產生和複製都應留在目前分頁。複製把字串寫入系統剪貼簿,不是 POST 到伺服器。打開 Network:複製之後,請求主體和分析事件裡不應出現那串密碼。需要留給同事時,用閱後即焚,不要依賴剪貼簿當傳輸通道。

密碼管理器自動填入是不是比複製更安全?

對「少一次系統剪貼簿暴露」來說,是。自動填入把密碼送進目前表單,不經過 Win+V 那份歷程。管理器若仍提供「複製」,那一次複製和產生頁的複製走的是同一塊緩衝區,仍然要覆蓋。選得了自動填入,就不要複製。