你的数据在哪里
这台机器握有一个人的哪些东西,以及删账号实际删掉了什么
删账号不会把那个人碰过的东西全部抹掉。以下是握有什么、在哪里、什么时候消失。
删除不等于抹除
账号是被洗干净,不是被丢掉。那条记录会留着,连同它的内部编号,因为分享还指着它,而「没有人上传过这个」和「上传的人不在了」是两件不同的事。
账号本身
那条记录不会被丢掉,而是就地洗干净:
| 删除之后 | |
|---|---|
| 你的用户名 | 换成一个没有人注册得到的占位值 |
| 你的 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,反馈问题时可以拿来对日志。
- 发信的中继每封确认信和重置信都会看到收件地址。它留了什么是那台机器的运维要回答的问题,不是这里。
- 存储供应商,文件放在 bucket 的话,握有那些文件。加密的分享在送到那里之前就封好了。
- 扫毒服务,扫毒开着的话,会收到每一个没有端对端加密的文件内容。
- Have I Been Pwned,密码检查开着的话,会收到每组新密码 SHA-1 的前五个字。没有任何能认出是谁的东西。
- 登录提供者知道有人通过它登录了这里。
取件码会进日志
/s/0ZPQ4M7K 是原样进请求日志的,而那组码就是取件用的凭证。日志送去哪里,标准要跟分享本身一样。
真的要抹掉
没有抹除功能,也没有办法导出你的数据。拿得到数据库的运维可以自己清掉剩下的:
先结束分享
在后台结束它们,或是删自己账号时让它们过期。内容要等分享死掉才会被释放。
等一轮扫描
每小时一轮,把文件放掉的是它。先删记录的话那些文件会变成孤儿,因为记录是唯一记着要删哪个文件的地方。
然后才删行
没有东西再指着洗干净的账号和死掉的分享之后,它们可以删。已经从存储里移除的东西不会回来。
以上跟备份无关。上星期的 dump 里还是完整的旧数据。