这篇文章也有 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."
简单来说:
- 你的设计 ID 是公开的(因为你把它嵌入到了 README 或个人网站中)。
- 由于没有身份验证,恶意用户只要知道你的 ID,就能向我们的服务器发送一个更新请求。
- 他们可以把你精心设计的卡片瞬间替换成任何令人不适的内容,甚至清空你的设计。
这对我们来说是不可接受的。你的 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.