缘由

Valine.js隐私泄露问题, 老灯完全是无意中发现的。老灯最近在研究一些serverless的东西,然后发现Valine.js挺多人用的。 于是也申请了一个LeanCloud国际版的id, 获取了密钥,然后开始在本地测试Valine.js

Valine.js评论系统,只需要嵌入几行js就完成了整个配置,并且API请求是直接走的LeanCloud服务器,不是像staticman那样需要有API中转。 可以说,整个体验过程非常顺畅。就功能性方面来说,Valine.js几乎是满分。

毕竟老灯之前也没怎么用serverless的东西,因此,主要目的,是学习一下serverless的这个思路,我觉得挺好的。 于是老灯习惯性地打开了Firefox控制台,看看这个serverless评论系统都发了哪些请求,这一看确实发现了一些问题。 这也是为什么有了这篇文章。

Valine 是如何泄露博主本人及所有评论者的隐私信息的?

我们先看一下官方的介绍:

Valine - 一款快速、简洁且高效的无后端评论系统。

由于某些原因,src目录将从v1.4.0后暂停更新.

Valine 诞生于2017年8月7日,是一款基于LeanCloud的快速、简洁且高效的无后端评论系统。

理论上支持但不限于静态博客,目前已有Hexo、Jekyll、Typecho、Hugo、Ghost 等博客程序在使用Valine。

特性: 快速, 安全, Emoji 😉, 无后端实现, MarkDown 全语法支持, 轻量易用, 文章阅读量统计

根据上面的信息,我们可得知:

  1. 无后端设计,部署非常简单
  2. 这个评论系统自从 1.4.0 版 之后, 基本上就等于是不开源了,如果我的理解没有问题。
  3. 主流的静态博客基本上它都支持
  4. 功能挺全的

我们先来看一下传统的CMS(或者说博客系统)的评论系统是如何设计的。以最流行的WordPress为例。

WordPress 采用 PHP + MySQL 的方案,因此它的评论是存储在server端的数据库里,里面会记录评论者的昵称,邮箱和IP及浏览器user agent信息。 但是一般的主题设计都会注重保护评论者的隐私,基本上不会直接显示邮箱和IP及浏览器user agent的完整信息。 当然,博主本人对于服务器数据库里的这些信息拥有绝对的控制权,但是就整个系统默认的设计来说,不会存在默认地隐性地隐私泄露问题。

然后我们再来看一下无后端的方案,Valine主要是使用LeanCloud的API来存取数据(评论信息)。而请求LeanCloud的API只需要两个东西: AppIDAppKey, 这两个东西, 对于 serverless 的评论系统来说,等于是对所有人是透明的。Ctrl + U 查看源码即可获取到。

我们看一下截图:

LeanCloud也有说明,AppKey 是公开的访问密钥,适用于在公开的客户端中使用。也就是说,任何人都可以拿到这个东西进行API请求。 由于评论者基本上分部在不同的地区,因此,这个API请求不可能限制来源IP。最多能做的也就是限制一下频率。还有限制一下请求的referer. 而HTTP referer这个东西在请求的时候需要伪造也是非常简单的事,可以说基本上不算限制。

AppKey 是公开的,基本上就表示,你通过这个API创建的数据,也是公开的。

像Valine这样,在公开的数据库里存储了用户的昵称,Email, IP地址 还有 浏览器User Agent完整信息,涉及隐私的信息,虽然默认在界面没有显示, 但是一打开控制台就一览无余了,如下图,是一个实际的例子(基于隐私考虑,以下截图关键信息已打码处理):

另外,由于 Valine 并不能确定哪个是博主,哪个是发送评论的游客,因此:

Valine将会泄露博主本人以及所有评论者的隐私信息的

由于纯js并不能获取用户的公网IP地址,因此 Valine 实际上是调用了一个公共的IP获取接口:https://api.ip.sb/jsonip?callback=getIP 调用方式为jsonp, 因此不会有跨域限制。

当然有人可能会反驳了,谁闲着没事来看浏览器控制台啊? 谁让你看控制台了?

有没有人来抓取这些泄露的隐私信息我不知道。 世界那么大,谁知道呢?

还有人会说,我们的隐私已经被各大平台卖得差不多了,还差这一点?

对此,老灯只想怼一句: 如果你被QJ了一次,你会觉得再被多少人QJ一次也无所谓了?

还有人会说,我的IP每天都变动,我的邮箱也算不上什么,泄露就泄露吧。

对此,老灯只想说: FK U! 你不注重,不代表别人不注重。评论系统是针对所有人的。所有评论的人都可能会使用这个系统。 不管是有意,还是无意。

既然像Valine这种默认情况下获取了用户隐私信息的serverless的评论系统无法保护用户的隐私, 老灯认为,Email, IP地址 还有 浏览器User Agent这些信息,那它就不应该在用户评论的时候自动抓取。 或者,至少在用户评论的时候,应该提醒用户,是否同意抓取这些信息。反正老灯目前没有看到这种提示。

我们来学习一下优秀的,比较注重用户隐私的评论系统的案例吧, remark42 是一个基于golang的评论系统(当然,它并不是serverless的),它使用boltdb存储用户的评论信息。 默认情况下,remark42甚至不会保存用户的邮箱地址。如果用户需要订阅评论回复怎么办?remark42有提供一个显式地“订阅邮件回复”的按钮。 尽管从remark42的实现来说,它是有后端服务的,并且一般情况下,数据库只有拥有服务器权限的人,也就是博主本人才能拿到。 所以,remark42完全有理由保存邮箱地址,但是它却没有这样做,而这样实现的主要目的,是因为remark42是比较注重隐私保护的。

我正在使用 Valine, 我要如何做才能防止它泄露隐私?

针对博主

  1. 马上删除你博客中的Valine嵌入代码,并更新静态博客的内容
  2. 马上停止你的LeanCloud中用于Valine的app的数据存储服务 (由于LeanCloud的AppIDAppKey无法重置,因此只能停止这个key的服务),或者在导出数据后删除app
  3. 向 Valine 开发者反馈隐私泄露问题
  4. 直到 Valine 解决隐私泄露问题, 否则,老灯不建议你使用它

针对所有人

直到 Valine 修复隐私问题,否则,当你看到任意博客的评论系统下面有“Powered By Valine”字样时,请不要提交评论。