冒充 GitHub 用户

3
使用git bash向github.com提交存储库一段时间后,我发现一些有趣的行为。
使用git config命令,我能够将本地repo中的电子邮件地址设置成任何我喜欢的内容...
git config user.email "MyColleague@work.com"

使用他的 github.com 邮箱地址后,我所做的所有提交都会出现在他的个人资料下,同时显示他的推测用户名和个人资料图片!

我正在使用存储的凭据进行 github.com 的身份验证,但我能够伪装成他。

我的两个问题是:

为什么这是可能的,这是有意设计的吗?

如何查看实际推送的身份验证/用户帐户详细信息而不只是提交的信息?

2个回答

6
这是由于git的设计,而不是GitHub,才变得可能。您需要进行身份验证以访问存储库。作为具有写入权限的人,您可以将提交推送到存储库。GitHub没有任何方式来验证提交本身。您可能已经从其他用户那里合并了它们。当您推送时,您不会说“这些是我的提交”,而是说“这些是要添加到存储库的提交,我有权添加提交到存储库”。
实际上,这正是拉取请求的工作方式。您向我发送提交,我批准将它们添加到(拉入)存储库中。提交仍然显示您的名称作为作者,因为您创建了它们。但是,我使用我的授权(和凭据)来添加它们。我在这样做时并不冒充您。
没有记录谁将每个提交推送到上游。这并没有存储在任何地方。假定具有推送访问权限的人对提交进行担保。
Git中有更强的身份验证机制,那就是签名标签。如果您想验证您是将特定标签附加到特定提交的人,则可以对其进行签名。这仍然不能证明所谓的提交“作者”是有效的。它只能证明你是签署者。
Joe Phillips在下面指出,现在可以签署单个提交。如果您在commit命令中添加-S,则会得到此功能。当使用mergepull时,您现在也可以验证签名。如果您的整个团队都使用此功能,您可能会获得所需的身份验证级别。
(请记住,在所有这些内容中,git中的“提交”是给定点上存储库中的所有代码。它不仅仅是您所做的更改。这有时会引起混淆,因此值得时刻牢记。)

1
在Git的更新版本(v1.7.9及以上版本),你现在也可以对单个提交进行签署。 - Joe Phillips
@JoePhillips 谢谢。已更新以包含该信息。 - Rob Napier
谢谢,这有助于我的理解。我认为Git在他们的文档中已经说得很清楚了:“Git是具有密码学安全性的,但它并不是万无一失的。”事实仍然存在,即github.com将毫不犹豫地匹配和关联在作者字段中看到的电子邮件地址。看起来签名会有所帮助。 - Meeple

1
这是期望的行为,但不是它看起来的样子。当你在.gitconfig中设置电子邮件时,并没有声明GitHub凭据。你所设置的只是应该用于创建新提交的“作者”字段的值。你甚至可以使用--author标志手动为提交设置此值。当你推送到远程仓库时,它会使用你的GitHub凭据,因此你仍然只能写入具有正确权限的仓库。总之,你并没有真正冒充你的同事,所有更改仍然是通过你的凭据进行的。你所做的只是记录提交的单个数据字段的不同值。

如果您需要更多关于GitHub的信息,可以查看这篇帮助文章:https://github.community/t5/Support-Protips/Why-is-my-commit-associated-with-the-wrong-person/ba-p/6728

GitHub甚至发布了一系列修复此类问题的步骤:https://help.github.com/en/articles/changing-author-info


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接