NOTE · 碎片

关于评论系统的隐私安全说明

  • #技术公告
  • #说明

关于评论区——你填的邮箱到底去哪儿了

这是一篇说明文档,目的是让你放心评论。如果只关心结论:你的邮箱只用于显示头像和评论通知不会公开不会被卖不会被发广告不会被任何第三方拿走。下面是细节。

昨晚有朋友看了开放评论的更新文,丢来一连串质疑——他懂技术,问得很尖锐:邮箱去哪儿了?会不会显示小尾巴公开在外?流量经过代理商会不会被劫持?要是有人恶意刷屏怎么办?

这些质疑都很合理。我自己在别的网站填邮箱也会犹豫一秒。所以这篇打算把整套数据流写清楚——能讲到的都讲,讲不到的也直说。

评论的字段只有三项:昵称(必填)、邮箱(必填)、网址(选填)。发表后其他人能看到的内容只有昵称、IP 归属地和浏览器信息。

需要说明的是:IP 归属地来自 Twikoo 内置的 GeoIP 数据库,精确到省市级别(不是你的精确位置),偶尔可能出现识别偏差——比如大陆用户被显示成"香港"或"台湾",这是数据库本身的局限,对评论功能没有影响。

邮箱的用途只有两个:显示头像(基于 Gravatar)、以及在您的评论被回复时收到通知邮件。如果您不希望接收通知或有隐私顾虑,可以填写虚假邮箱或随意字段,这是您的权利。

不建议的行为:冒充他人邮箱、使用公共邮箱骚扰他人。如发现上述情况,本站会封禁对应 IP 和邮箱的评论权限。如果您发现自己的邮箱被冒用,请及时联系站长shiffon@foxmail.com协商解决问题。


一、关于邮箱本身

Q1:我把邮箱填进去,会被收集、转手、卖给营销公司吗?

不会,因为没有"中间商"在这条链路里。

很多人对邮箱的担心来自一种行业经验——你在某些大平台注册账号,填邮箱,过几天就开始收到来自陌生公司的"诚意推荐"。原因是大平台的隐私协议里藏了"我们可能与合作伙伴共享您的信息"这种条款,邮箱被卖了或者泄露给了广告 SDK。

我这里没有这种链路。本站没有用任何第三方分析工具(没有百度统计、没有 Google Analytics、没有任何广告 SDK),也没有跟任何"合作伙伴"共享数据。你的邮箱只在两个地方出现:

  1. MongoDB Atlas 数据库——评论数据存这里,是我自己的独立数据库,没有其他人能访问
  2. Gravatar 头像服务——你的浏览器会用邮箱的 MD5 哈希值去 Gravatar 拿头像(如果你注册过的话),但 Gravatar 收到的是哈希,不是邮箱明文
  3. Resend 邮件服务商——只在站长使用自身邮箱时会产生验证,代理商会发送验证码字段到您的邮箱进行校验,这是为了防止有人冒充站长发表评论,普通用户的邮箱不会产生验证码。

没了。我自己也不会"导出"你邮箱去做别的事——这事一查就破,不值得。

Q2:那 MongoDB 数据库要是被黑,我的邮箱不就泄露了?

理论上对,实际上风险极低,原因有三层:

第一层:传输加密——你提交评论时,数据走 HTTPS(TLS 1.3)从你浏览器到 Cloudflare,再到 Netlify,再到 MongoDB,全程加密。中间任何一段都看不到明文邮箱。

第二层:访问控制——MongoDB Atlas 是 MongoDB 公司官方托管的数据库服务(不是我自建的),有连接字符串 + 用户名密码 + IP 白名单三重保护。攻击者要拿到我的邮箱列表,需要同时拿到我的连接字符串和数据库账号密码——这两个东西不在代码仓库里,只在我自己电脑和服务器环境变量里。

第三层:邮箱本身的风险有限——退一万步说,就算数据库真泄露了,泄露的是邮箱+昵称+评论内容,没有密码(评论系统根本不要密码)、没有真名、没有任何能追溯回你身份的东西。和你在某购物平台注册账号造成的潜在损失不在一个量级。

如果你仍然不放心,可以填一个二级邮箱——专门用来评论的临时邮箱(QQ 邮箱可以申请别名,Gmail 在主邮箱前加 +xxx 也行),这样即使有任何事,主邮箱不受影响。

Q3:那个"小尾巴"——我的邮箱会不会显示在评论旁边给所有人看到?

不会。这是 Twikoo 的固定行为:邮箱永远不显示,只显示你填的昵称。

来看一条评论实际显示出来的样子:

没有邮箱。没有 IP 地址(只显示省级位置)。没有任何能直接定位到具体一个人的信息。

唯一可能"反推"的可能是头像——Gravatar 头像是基于邮箱哈希生成的,理论上如果你的邮箱在 Gravatar 注册过且全网公开,别人对着头像查可能能查出你的 Gravatar 主页。但这要求你自己之前在 Gravatar 设了公开主页。如果你没注册过 Gravatar,头像只是一个根据邮箱哈希生成的色块,反推不出邮箱。

Q4:你(博主)能看到所有人的邮箱吗?

技术上能,因为我能登录数据库后台。

但实际上:

  • 不会主动看——单条评论的提醒邮件里没有邮箱字段,正常运维流程根本接触不到
  • 不会用它——没有理由给陌生读者发邮件
  • 不会保存到本地——没有把数据库内容导出到我个人电脑的习惯

如果你完全不希望我有任何看到的可能性,最直接的办法是评论时填一个"专门用来评论这一次"的临时邮箱(很多邮件服务都支持别名/临时地址)。但说实话,匿名评论也是允许的——你可以填一个完全随机的字符串作为邮箱(比如 random@example.com),评论一样能发出去,只是没有 Gravatar 头像而已。


二、关于流量与攻击

Q5:流量从我这儿到你服务器,要经过 Cloudflare、Netlify 这些代理商。怎么保证中间不会被劫持攻击?

HTTPS 解决了"内容被偷看/被篡改"的问题——你浏览器和最终服务器之间是端到端加密,中间任何代理(包括 Cloudflare、Netlify、你公司的代理服务器、运营商)都看不到明文。这是 HTTPS 的设计初衷,不是我能选的,是浏览器和协议层强制的。

HTTPS 没解决的是"流量本身存在"这个事实——也就是说,路过的代理商能看到"某 IP 在某时间访问了 shiffon.net 的某 URL",但看不到 URL 后面 query string 的内容、看不到 POST body、看不到 cookie、看不到任何业务数据。

Cloudflare 在这条链路里能看到什么——本站的 DNS 和静态资源都托管在 Cloudflare,所以 Cloudflare 知道"你访问了这个站",也作为反向代理转发了你的评论 POST 请求。但 Cloudflare 不会保留这些数据用作他用(这是它的合同义务,也是它整个生意的信誉基础)。如果 Cloudflare 哪天背叛了所有客户公开数据,那就不是我一个博客的问题,是全世界一半互联网的问题。

更具体的"代理商劫持"是指什么——如果是国内运营商的传统劫持(比如插广告、改 DNS),这只对 HTTP 站点生效,对 HTTPS 站点(本站全程 HTTPS)无效。如果是更高级的攻击(比如吊销证书、伪造证书),这种攻击成本极高、目标必须是有价值的政企/银行,本博客不在那个目标层级。

简单结论:普通流量传输环节几乎不可能被针对性劫持,能被劫持的场景对你日常评论博客造不成实质损失。

Q6:那如果有人在公共 Wi-Fi 上评论呢?

也安全。HTTPS 的端到端加密也包括"公共 Wi-Fi 路由器"这一段。咖啡店的免费 Wi-Fi 路由器只看到你访问了 shiffon.net,看不到你的评论内容和邮箱。

唯一要注意的是——如果你电脑被装了奇怪的根证书(比如某些公司给员工电脑装的监控证书),那就另当别论。但那种情况下你打开任何网站都不安全,不是评论区的问题。

Q7:通过浏览器开发者工具,别人能看到我刚填进去还没提交的邮箱吗?

只能看到他们自己浏览器里的内容——也就是说,你坐在你电脑前用 F12 看自己的浏览器,能看到自己填的邮箱(这是浏览器本身的功能,任何网站都一样)。

别人没法通过他自己的浏览器看到你的邮箱——你和他的浏览器是隔离的。除非他物理上坐在你电脑前用你的电脑,那种情况是你电脑物理安全的问题。


三、关于"恶意攻击者"

Q8:要是有人恶意刷屏、刷广告、人身攻击我或攻击其他读者怎么办?

这个问题的应对分三层。

第一层:技术层防刷

  • Twikoo 自带 Akismet 反垃圾 引擎(和 WordPress 用同一套),能识别绝大多数自动化刷屏脚本和广告
  • 一个 IP 在短时间发大量评论会被频次限制
  • 评论字数有上限(500 字),不会被巨量文字洪水冲垮

第二层:博主邮箱验证(这就是那个验证码弹窗的存在意义)

很多人会担心:会不会有人冒充我(博主)发评论混淆视听

这是真实风险——评论系统只要昵称+邮箱,理论上谁都可以填我的昵称"西风シフォン"和我的邮箱发评论。所以本站做了一个额外的机制:当有人填写到我的几个常用邮箱时,必须先收到该邮箱的真实验证码邮件、输入正确后,才能以"博主身份"发评论

也就是说——任何人填我邮箱发的评论,要么走完整邮箱所有权验证(通过则可信),要么就直接发不出去。冒充我留言的可能性被堵死了。

第三层:人工审核

  • 我有评论后台,能删任何明显违规的内容(人身攻击、广告、政治敏感等等)
  • 对持续骚扰的访客可以拉黑 IP
  • 如果某条评论是针对其他读者的人身攻击,看到了会立刻删除

但说实话——完全恶意的攻击者其实大多数时候不会来到一个个人博客的评论区,因为这里的"流量"和"曝光度"对他没价值。骚扰多发于大型平台(微博、知乎),他在这里骂人没人围观,没成就感,自然就不来了。所以本站的实际风险不大。

Q9:要是有人填我(普通读者)的邮箱冒充我评论怎么办?

这个风险存在,但有几个限制因素:

  1. 冒充者必须知道你的邮箱——这本身就是一个不容易跨过的门槛(除非你的邮箱已经全网公开)
  2. 冒充者只能写昵称、不能改你已经发过的评论——博主不能让两条相同邮箱不同昵称的评论自动合并
  3. 如果你担心被冒充,最简单的对策是评论时填昵称带一个你独特的标识(比如固定带某个字符串)。这样别人即使知道你邮箱也不知道你的"暗号"

不过老实说,对于普通访客的"被冒充"防御我没做严格保护——成本远高于收益。如果某天真发生了,请私信我(邮件、社交账号都行),我会处理。

Q10:要是你(博主)哪天关站了,我评论留下的邮箱怎么办?

和数据库一起删除

数据库托管在 MongoDB Atlas 的免费集群,关站时我会主动销毁集群(销毁后无法恢复)。Cloudflare、Netlify 上的所有服务也会一并下线。你的邮箱不会"被某个继任者继承",因为数据库就在我自己的账户下。

如果你想现在就删除你的所有评论和邮箱,发邮件给我(noreply 那个不行,你要发到 shiffon@foxmail.com),告诉我具体哪条评论或者你用的邮箱,我会从数据库里手动删掉。


四、关于这个"验证码弹窗"

Q11:第一次评论填邮箱发现还要收验证码,是不是钓鱼?

不是。这个弹窗只在你填的邮箱正好命中我个人常用邮箱列表时才出现——目的是保护我自己不被冒充,不是怀疑你。

如果你填的是任何其他邮箱(包括你自己的工作/生活邮箱),评论框不会要求验证码,直接点发送就提交。

Q12:验证码邮件来自 noreply@shiffon.net,怎么确认它是真的?

几个判断点:

  • 发件域名@shiffon.net 是本站的官方域名(你访问的就是 shiffon.net)
  • 邮件内容:纯净的米色卡片样式,只有一个 6 位数字和"5 分钟内有效"的提示,没有任何"点击此链接""下载附件""扫描二维码"的可疑跳转
  • 没有附件:钓鱼邮件常常带附件或可疑链接,这个邮件不带

如果你没主动在 shiffon.net 评论时触发就收到这封邮件,那是有人在你不知情的情况下用你邮箱来这里评论——这种情况你忽略邮件就行,验证码失效后什么都不会发生。

Q13:Resend 是个什么公司?为什么选它发邮件?

Resend 是 2023 年成立的邮件 API 服务,专为开发者设计,公司在美国,做的是"邮件代发"这一件事。

选它的原因:API 简洁、免费额度对小博客足够、合规度高(GDPR 合规)、不像某些大厂会拿邮件内容做训练或分析。本站只用 Resend 发"评论通知 + 验证码"两类邮件,没有任何营销或推广用途。

如果将来 Resend 出问题或政策变更,会换其他类似服务(Mailgun、Postmark 等都是同类)。但你的邮箱本身不会经过 Resend 持久存储——Resend 只在发送邮件那一瞬间用一下,发完就忘。


五、写在最后

这篇是写给质疑我评论系统的朋友的,但希望读到这里的所有访客都能放下顾虑:

  • 我自己也是个人在网上也警惕填邮箱的人,能少填一处就少填一处
  • 所以我做评论系统时刻意选了不需要注册账号、不强制验证、不收集手机号的方案——把读者门槛压到最低
  • 但门槛低的代价是冒充风险,所以加了针对博主邮箱的二次验证(你看到的那个弹窗)
  • 整套系统所有代码都在 GitHub 上是开源的,质疑我的话可以直接看代码

如果还有这篇没覆盖的疑问、或者觉得某条解释不到位——直接在评论区留言(看,这是个良性循环,质疑者会贡献内容),或者发邮件给我。

阅读 ···
留言 · 评论