你的資料在哪裡
這台機器握有一個人的哪些東西,以及刪帳號實際刪掉了什麼
刪帳號不會把那個人碰過的東西全部抹掉。以下是握有什麼、在哪裡、什麼時候消失。
刪除不等於抹除
帳號是被洗乾淨,不是被丟掉。那筆紀錄會留著,連同它的內部編號,因為分享還指著它,而「沒有人上傳過這個」和「上傳的人不在了」是兩件不同的事。
帳號本身
那筆紀錄不會被丟掉,而是就地洗乾淨:
| 刪除之後 | |
|---|---|
| 你的名稱 | 換成一個沒有人註冊得到的佔位值 |
| 你的 email 地址 | 同樣換掉 |
| 那個地址驗證過沒有 | 忘掉 |
| 帳號本身 | 標成已刪除,連同時間和是誰動的手。任何東西都登不進去 |
| 它的內部編號 | 留著,因為分享還指著它 |
| 你的密碼 | 刪掉 |
| 綁定的其他網站帳號 | 刪掉 |
| 你選的外觀 | 刪掉 |
舊版刪掉的帳號
修好之前,刪帳號會把密碼雜湊、綁定的登入方式和偏好留下來。那時候刪的帳號現在還留著這些,不會事後回頭清。
名字和地址都會被釋放出來,別人可以拿去註冊。
墓碑用的值搶不走
gone- 這個名字前綴和 deleted.invalid 這個網域,一般的解析器會拒絕,所以沒有人能註冊一個冒充已刪帳號的名字或地址。
登入紀錄
這台機器對一個人知道得最多的,是他從哪裡登入。每一次登入會記下來源位址、瀏覽器、最後一次出現的時間,以及為什麼結束。
被刪帳號的 session 會立刻全部移除,自助刪除和管理員刪除都一樣。
單純結束的 session 會留著,因為這張表同時是登入紀錄,使用者要靠它回答「有沒有別人進來過」。掃描會在它超過 auth.login_history_days(預設 90 天)之後清掉。
你看得到自己的每一次登入,包括來源位址、瀏覽器、最後出現的時間,以及為什麼結束。你可以結束其中一個,或是結束除了正在用的那個以外的全部。
結束一個 session 不等於忘掉它
那一列會留到歷史視窗結束為止,不然「有沒有別人進來過」就答不出來。
誰打開過這份分享
預設關。share.access_log.enabled 開著的時候,每一次真的把內容交出去就寫一列:時間、位址、User-Agent 字串。
| 誰讀得到 | 管理員。上傳者讀不到 |
| 留多久 | share.access_log.retention_days,預設 30 天。填 0 會被拒絕,不是當成永久 |
| 什麼不算 | HEAD,所以連結檢查器、預抓、聊天軟體展開網址都不會留下東西 |
位址在沒有誠實答案的時候是 null,前面掛著不受信任的代理就是這種情況。User-Agent 截到 512 bytes。
關掉不會留住舊的紀錄
掃描照保存期跑,不看那個開關。
GET /api/v1/capabilities 會回報 access_log,所以分享頁可以在訪客打開任何東西之前先告訴他。
計數器是另一回事
看過幾次、複製過幾次是客戶端算的,因為有人在螢幕上讀一段文字、或按下複製的時候,伺服器什麼都收不到。誰都能灌水,所以沒有任何東西依賴它們,而且那個數字說不出是誰做的。
取件次數不是這樣算的。那個由伺服器自己算,客戶端跳不過去。
憑證
這些都不留發出去的那串值,只留一段拿來核對的指紋。
| 什麼時候消失 | |
|---|---|
| API 權杖 | 跟著帳號一起刪 |
| 備用碼 | 跟著帳號一起刪 |
| 重設密碼的連結 | 跟著帳號一起刪,或過期就清掉 |
| 驗證地址的連結 | 跟著帳號一起刪,或過期就清掉 |
| 邀請碼 | 過期就清掉 |
邀請碼只記被用掉幾次,不記誰用的,所以一組碼串不起兩個帳號。
有兩種登入用的東西存法不同。驗證器 App 的密鑰用這台的金鑰封起來,因為每一組驗證碼都是從它算出來的。通行密鑰存的是公鑰,私鑰從來不離開裝置。兩者都跟著帳號一起刪。
上傳的東西
這部分會留下來。
帳號消失的時候,這些一個都不會動。
要結束它們有兩條路:
- 刪自己的帳號會先把所有還活著的分享設成過期,除非你選擇讓連結繼續能用。內容在下一輪掃描被回收,紀錄再過
share.retain_after_death_hours才消失。 - 管理員可以另外一次結束某個帳號的全部分享。只刪帳號的話它們會繼續跑。
存起來的檔案是按年、月和一組隨機編號歸檔的,路徑裡不會出現名字或地址。
其他網站上的帳號
透過 GitHub、Discord 或身分提供者登入,會存下是哪一家,以及那一家給你的識別碼。那個識別碼是一個數字或一串看不出意思的字,不是你的名字,因為名字會改、也會被別人拿走。解開綁定就會刪掉它。
加密的分享
端對端加密的分享,存的是這台機器沒有金鑰的位元組:內容、檔名、類型和標題在這裡都讀不到。機器還知道的,是每個檔案多大、有幾個、什麼時候建的和過期,以及被拿了幾次。
沒完成的註冊
有設定寄信的話,在帳號真的存在之前,對方填的名稱、地址和密碼就已經被收著了。這是刻意的:帳號那邊什麼都還沒寫,所以「這個地址在這裡註冊過沒有」問不出來。
過期之後掃描會清掉。
不在資料庫裡的
- 節流計數只在記憶體裡,按來源位址記。重啟就清掉,不會落到磁碟。
- 請求日誌記 method、path 和一個 request id。沒有位址,沒有帳號。取件碼會出現在裡面,因為它就在 path 上。伺服器出錯時,回應裡會帶同一個 request id,回報問題時可以拿來對 log。
- 寄信的中繼每封確認信和重設信都會看到收件地址。它留了什麼是那台機器的操作者要回答的問題,不是這裡。
- 儲存供應商,檔案放在 bucket 的話,握有那些檔案。加密的分享在送到那裡之前就封好了。
- 掃毒服務,掃毒開著的話,會收到每一個沒有端對端加密的檔案內容。
- Have I Been Pwned,密碼檢查開著的話,會收到每組新密碼 SHA-1 的前五個字。沒有任何能認出是誰的東西。
- 登入提供者知道有人透過它登入了這裡。
取件碼會進日誌
/s/0ZPQ4M7K 是原樣進請求日誌的,而那組碼就是取件用的憑證。日誌送去哪裡,標準要跟分享本身一樣。
真的要抹掉
沒有抹除功能,也沒有辦法匯出你的資料。拿得到資料庫的操作者可以自己清掉剩下的:
先結束分享
在後台結束它們,或是刪自己帳號時讓它們過期。內容要等分享死掉才會被釋放。
等一輪掃描
每小時一輪,把檔案放掉的是它。先刪紀錄的話那些檔案會變成孤兒,因為紀錄是唯一記著要刪哪個檔案的地方。
然後才刪列
沒有東西再指著洗乾淨的帳號和死掉的分享之後,它們可以刪。已經從儲存裡移除的東西不會回來。
以上跟備份無關。上禮拜的 dump 裡還是完整的舊資料。