改了下 gitalk,增加了匿名评论功能

2020-08-23 22:01:34 +08:00
 bigbyto

gitalk 是个很有创意的项目,不过它的缺点也很明显,安全性欠妥。之前已经有人在 V2EX 讨论过 github 权限粒度过高,授权时容易被恶意利用的问题。前几天给博客换评论系统,发现 gitalk 还是很不错的,于是改了一下。

匿名评论主要的思路是:

  1. 创建一个新的 github 账号
  2. 获取该账号的 personal access token,scope 选中 user 和 repo
  3. 把该 token 存放于服务器,编写一条 api
  4. 修改 gitalk 的 ui,新增一个匿名评论按钮,用户点击时把数据发送到我们的 api,让 server 去完成创建评论的请求。

当然也可以直接把 personal access token 放到前端直接请求,这样很不安全就是了。我还把它的授权流程也放到了 server 上,解决在 client 暴露 secret 的问题。

大致就是这样,懒得使用第三方的评论系统。gitalk 原生支持 markdown 和它的 ui 都是非常吸引人的~更详细的可以看看我博客的介绍。

https://wiyi.org/gitalk-anonymous-comment.html

效果:

2770 次点击
所在节点    程序员
12 条回复
yanshenxian
2020-08-23 23:51:31 +08:00
> 1 整个 OAuth 流程放在前端,暴露了 client_id 和 client_secret
> 首先我把授权流程放到了 server 端,解决第一个和第三个问题。

这个确实有想法 👍 服务端代码能放出来吗...

另外有个问题就是,走了一遍你的代理,对登录用户来说安全性也没法保证

我之前也因为 github api 的国内网络访问问题,考虑加层 cf 代理 (见 https://blog.yanshenxian.xyz/article/gitalk-proxy-github-api-request/) 后来想到安全性还是放弃了

要从根本上解决这个问题,还是得改成 github app 的方式,比如用 utterances

前几天我还看到有人把 vssue 改成了 github app 项目 ( https://github.com/meteorlxy/vssue/issues/109)

综上所述。。我觉得还是用 utterances 方便些
yanshenxian
2020-08-23 23:55:50 +08:00
我觉得 client_id 和 client_secret 暴漏了其实问题也不大。参考 https://github.com/gitalk/gitalk/issues/150
用户要想获取其他人的 Authorization Code 并不容易。相反博客管理者想要获取授权评论用户的 token 很容易。
ochatokori
2020-08-24 00:01:54 +08:00
用 gitalk 难道不是为了省去后端服务器吗
既然都有后端服务器的直接服务器放 client_secret 不就行了

推荐用 https://utteranc.es/
bigbyto
2020-08-24 00:06:41 +08:00
@yanshenxian
代码我是用 node 的写的塑料代码😂,放在 vercel 上的。说实话 js 不是我擅长的语言,等我完善一些会放出来。仓库地址是 https://github.com/xingty/gitalk-anonmously-comment,可以留意一下。

还有一点走我的代理确实是让 accessToken 经过我的服务器,如果不信任的话,用匿名评论就好了。
bigbyto
2020-08-24 00:11:08 +08:00
@yanshenxian client_secret 毕竟是属于私密的数据,能不暴露不暴露更好。确实如你所说博客管理者能获取 accessToken,基于这个考虑才加入了匿名的功能。
bigbyto
2020-08-24 00:12:33 +08:00
@ochatokori
@yanshenxian

utterances 之前没了解过,有时间去研究一下。如果能兼容现有的以后花时间折腾一下,不行的话就暂时这么用着了。
ochatokori
2020-08-24 00:36:25 +08:00
@yanshenxian 用户一旦同意授权(证明用户信任这个 client_id 和 client_secret),任何人都可以通过泄露的 client_id 和 client_secret 获取那个用户的 token,只要用户访问了攻击者的网站
yanshenxian
2020-08-24 09:09:31 +08:00
@ochatokori 就算暴漏了,只有用户显示点击登录才能拿到 token 吧,这样和攻击者用自己的 client_id 和 client_secret 有什么区别,难道还有其他办法直接获取??
stebest
2020-08-24 09:50:08 +08:00
这样就创建了很多无意义的僵尸号,是不是有点浪费资源。
利用 github 存储评论可以算正当使用,但这个不停的创建无意义的小号,就算滥用了吧?点匿名评论时候切换到别的评论系统,我觉得还是挺方便的,我自己也是这样,感觉效果还行。
ruanimal
2020-08-24 10:06:29 +08:00
没啥问题,反正大部分人博客没几个评论。。。
bigbyto
2020-08-24 10:47:07 +08:00
@stebest
还不至于到滥用的程度,把这个当作个人的小号来用即可。
ochatokori
2020-08-24 13:40:36 +08:00
@yanshenxian #8 只有第一次要点登录(就是在博客那个地方),之后如果访问攻击者的网站,攻击者的网站应该就可以直接用 client_id&client_secret 拿到 token 了(我不是很确定 github 的 oauth 有没有判断 referrer)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/700785

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX