这篇文章也有 English 版本。

为什么我们要求登录 GitHub?从便利到安全的转变

在 GitHubCard 发布初期,我们引以为豪的一个特性是“零门槛”——用户无需登录,即可创建和分享精美的 GitHub 卡片。我们的初衷是降低工具的使用门槛,让尽可能多的用户能快速体验到产品的价值。

然而,随着用户量的增长和社区反馈的深入,我们发现这种“完全开放”的模式带来了一个不可忽视的安全隐患。为了保护每一位创作者的心血,我们做出了一个决定:全面启用 GitHub 登录验证

在这篇文章中,我们将坦诚地分享这一决策背后的思考,以及它对你意味着什么。

发现问题:当“便利”变成“漏洞”

最初的设计逻辑很简单:任何人都可以在画布上编辑设计,点击保存后,系统会生成一个唯一的设计 ID(例如 afB0FP_V)。只要拥有这个 ID,就可以通过 API 更新设计内容。

这种设计在小范围使用时非常便捷,但正如一位敏锐的用户向我们反馈的那样,它存在严重的 IDOR (Insecure Direct Object References) 漏洞:

"The project looks very nice, but it’s possible to vandalize other users’ cards/profiles:

Let's say user A creates a card with custom design id afB0FP_V and embeds the created card in their GitHub profile. Then user B can see in user A's profile which design id the card uses and make a request to the githubcard.com API to update this design and completely change its contents. This overrides user A's design and allows user B to vandalize user A's GitHub profile."

简单来说:

  1. 你的设计 ID 是公开的(因为你把它嵌入到了 README 或个人网站中)。
  2. 由于没有身份验证,恶意用户只要知道你的 ID,就能向我们的服务器发送一个更新请求。
  3. 他们可以把你精心设计的卡片瞬间替换成任何令人不适的内容,甚至清空你的设计。

这对我们来说是不可接受的。你的 GitHub Profile 是你的数字门面,我们绝不允许它面临被恶意涂鸦的风险。

我们的解决方案:身份即防线

为了彻底根除这一风险,我们引入了基于 GitHub OAuth 的身份验证机制,并实施了以下安全策略:

1. 强制所有权验证 (Ownership Verification)

现在,当你创建一个新设计时,该设计会与你的 GitHub 账户永久绑定。

  • 只有作为设计所有者的你,才有权限修改或删除该设计。
  • 其他用户即使知道你的设计 ID,也无法进行任何更改。

2. 安全的 API 设计

我们的后端接口现在会严格检查每一次写操作(Create/Update/Delete)的 Authorization 头。如果没有有效的 Token,或者 Token 所属用户与设计所有者不匹配,请求将被立即拒绝。

3. 只读的公开访问

别担心,设计的展示依然是公开的。你生成的 SVG/PNG 链接(如 https://githubcard.com/Cactusinhand.svg?d=JkKGFDBE)依然可以被任何人访问和嵌入,但这些接口是只读的(Read-Only),绝对安全。

登录带来的额外好处

除了安全性,登录机制还为我们开启了更多功能的可能性:

  • 数据安全:你的设计现在绑定在你的账户上。无论何时何地,只有通过 GitHub 验证的你才能访问编辑权限,彻底杜绝了匿名用户的恶意操作。
  • 更高配额:登录用户将拥有更高的 GitHub API 调用额度。

最后

虽然多了一个登录步骤,但这也是为了大家的设计能安全地保存在云端。

感谢大家的理解,希望大家继续玩得开心!如果有任何问题,欢迎随时在 Feedback 上反馈。

准备创建受保护的设计时,可以使用 GitHub 个人名片生成器GitHub 仓库卡片生成器

祝编码愉快!


GitHubCard Team

Turn this into a card

Turn the ideas from this article into an editable GitHub profile card, repo card, or README section.