一个github commit如何泄露个人信息 —— 记一次惊险的“自我开盒”
在开源世界里快乐地提交代码,是每个程序员的日常。但在 GitHub 网页上看着自己帅气的头像和昵称时,你可能不知道,底层的 Git 记录可能早就把你的真实姓名和邮箱扒得底朝天了。
前几天,我就亲身经历了一次惊险的“自我开盒”。
事件经过
事情的起因很简单:我给一个开源项目修了个 Bug,兴冲冲地写好代码,git commit,然后 git push 到我自己的 Fork 仓库,最后在 GitHub 网页上开启了一个 Pull Request(PR)。
看着网页上绿色的 “Open” 标签,提交记录里显示着我的 GitHub 昵称和头像,一切看起来都那么完美、极客、且匿名。直到我顺手在终端里敲下了一行命令……
发现问题
我在翻 git log 时无意发现,我的真实姓名拼音和私人邮箱赫然躺在提交历史里!
起初我以为只是本地显示的问题,毕竟去 GitHub 网页上看那个 PR 时,Commit 列表里明明写的是我的网名。为了验证,我点进了那个 Commit 的详情页,并在浏览器网址最后面加了一个 .patch,按下了回车。
纯文本页面加载出来的那一刻,我倒吸一口凉气。在最顶端第二行,白纸黑字写着:
From: 我的真实姓名 <我的真实私人邮箱>
原来,GitHub 网页端的昵称只是一层“视觉伪装”。Git 的底层逻辑是认邮箱的,只要你本地 Git 配置(git config)里用的是真名和真邮箱,当你推送到云端时,GitHub 就会把这些底层数据永久记录下来。即使网页上给你套了个滤镜,任何一个把代码 git clone 到本地的人,或者爬虫程序,都能轻易地读取到你的隐私信息。
好在 PR 还没有被原作者合并(Merged),主动权还在我手里。一场与时间赛跑的隐私保卫战开始了。
解决方案
为了彻底抹除这些痕迹,我摸索出了一套标准的“急救”工作流:
1. 关闭 PR (Close PR)
这是止损的第一步。如果带有真名的提交被合并到了上游主仓库,那神仙也难救了(只能去求源项目的管理员帮改历史)。 我立刻在网页上点击了 Close pull request,切断了这段代码进入主分支的可能。
2. 修改本地 Git Commit
PR 关了,但我自己仓库里的历史依然是脏的,需要给它们“洗白”。
第一步:修改本地配置,换上 GitHub 隐私邮箱
git config --global user.name "我的安全昵称"
git config --global user.email "[email protected]"
(注:隐私邮箱可以在 GitHub Settings -> Emails 里找到)
第二步:原地开启备份,回退主分支,重写历史
为了安全,我先打了个备份分支,然后用 git reset --hard 把开发分支退回到了泄露前的干净状态。接着创建一个新分支 new-pr-branch。
针对那几个带真名的提交,我使用重新提交的方式(或者使用 git commit --amend --reset-author)把它们搬了过来。因为已经更新了 Git 配置,这次生成的全新 Commit 终于带上了安全的昵称和 noreply 邮箱。
3. 推送变更到 GitHub
本地历史洗干净后,我将全新的分支推送到 GitHub:
git push origin new-pr-branch
随后,我去网页端把之前那个带有真名的旧分支(也就是提旧 PR 的分支)彻底删除,并用这个干净的新分支重新开了一个 PR。业务逻辑没变,但底层的“黑历史”已经被替换了。
4. 联系 GitHub 隐私客服删除泄露的提交 (终极杀招)
你以为删了分支、关了 PR 就万事大吉了吗?并没有。 GitHub 有一个“悬空提交(Dangling Commits)”机制。只要你的 Commit 曾经被 PR 关联过,哪怕分支删了,只要别人有那个 Commit 的 Hash 链接,依然能点进去看到你的真名。
为了真正地“扬灰”,我前往了 GitHub Support 隐私表单,提交了一个 “Remove data (PII)” 的请求。 我在邮件里附上了那个已关闭 PR 的链接,以及泄露真名的 Commit Hash,请求官方在服务器底层执行粉碎(Purge)。不得不说,GitHub 客服处理隐私问题的速度极快,没过多久,那几个带着我真名的悬空页面就彻底 404 了。安全落地!
总结
这次“惊魂”经历给我上了生动的一课。为了防止悲剧重演,我总结了两个防身铁律,强烈建议所有开发者立刻设置:
- 绝对不要轻信网页上的昵称:验证隐私有没有泄露的唯一标准,是用
git log看本地,或者在 GitHub 链接后加.patch看底层数据。 - 开启 GitHub 的防火墙机制:
强烈建议去 GitHub 的
Settings -> Emails里,不仅要勾选 Keep my email addresses private,更要勾选 Block command line pushes that expose my email! 只要开了这个选项,如果以后你的本地电脑忘了配置隐私邮箱,带着真邮箱去git push时,GitHub 服务器会直接拒绝接收并报错。把危险拦截在本地,才是最省心的做法。
开源很美好,但保护好自己的隐私同样重要。希望这篇记录能帮到同样踩坑的朋友们!