如何实现配置文件的版本控制?

34

假设我们有一个包含敏感密码的配置文件。我想对整个项目进行版本控制,包括配置文件,但我不想分享我的密码。
如果这个配置文件是:

database_password=secret
foo=bar

变成

database_password=*
foo=bar

其他版本控制系统的用户也可以自己设置密码。忽略该文件并不是一个好的做法,开发人员应该意识到配置文件是否有变化。

例子:

本地版本:

database_password=own_secret
foo=bar

版本控制系统中的配置文件:

database_password=*
foo=bar

突然间,配置文件发生了改变:

database_password=*
foo=bar
baz=foo

而本地版本将成为每个开发者的版本:

database_password=own_secret
foo=bar
baz=foo

这是我的解决方案。我该如何实现这种行为?你是如何存储配置文件的?有没有一种方法可以做到这一点,或者我应该去捣鼓什么?


6
配置文件不应包含明文密码。 - Mitch Wheat
1
事实上,最好永远不要在配置文件中存储任何类型的密码...除非它是由服务器保存的配置文件,即使是这样... - Mitch Wheat
2
你是指以编程方式而不是实用主义方式吗? - user195488
1
@TobiasKienzler:我需要相反的身份验证方式。(我不确定你是否理解了这一点。)我的应用程序必须向SQL服务器提供密码以创建连接,而不是对用户进行身份验证。(我非常了解哈希的概念,但在这里行不通) - erenon
1
@erenon m-/ 对不起,我完全搞错了。根据您的安全要求,您可能仍然需要考虑加密...(取消踩) - Tobias Kienzler
显示剩余7条评论
9个回答

30

不要将实际的配置文件放入版本控制中,而是可以将模板或默认文件放在版本控制中,并编写一个脚本来请求数据库信息和凭据以生成真正的配置文件,这个配置文件应该被排除在(即忽略)版本控制之外。在检出时,开发人员可以运行此脚本以获得工作环境。该脚本也可以作为应用程序使用的任何安装过程的一部分来调用。

还可以查看我对类似问题的回答


13

我不确定你的配置是如何实现的,但是我会使用层次化覆盖来处理这个问题。

你可以有一个包含通用配置和虚拟用户名/密码(或完全省略)的主配置文件。然后每个开发者创建一个本地的override.config(或其他名称),其中包含他们特定的用户名/密码。主配置文件放在源代码控制下,而开发者(或机器)的本地覆盖不需要。

我已经在.NET中完成了这个操作,但是对于PHP而言,我不知道这个操作是否容易,请见谅。


这看起来非常聪明。为了实现这一点,也许我只需要子类化我的框架配置解析器。 - erenon
1
+1 这正是我们在几乎所有项目中处理配置文件的方式,具有不同层次结构。 - ZoogieZork

5
创建一个本地覆盖文件,其中包含用户特定信息作为PHP变量。
例如,创建一个名为local_overrides.php的文件,其中包含以下内容:
$local_password = 'qUzaEAFK13uK2KHy';

然后在包含您的数据库密码的文件中,执行以下操作:
$overrides = 'local_overrides.php';

if (file_exists($overrides)) {
   #include_once($overrides);
   $db_password = $local_password;
} else {
   // perform appropriate action: set default? echo error message? log error?    
   $db_password = 'l1m1t3d!'
}

本地覆盖文件不需要被源代码控制系统看到。

3

是否有一个单独的文件只存储机密信息,并且不受版本控制?

或者更理想的是,完全取消密码,使用openssh或类似工具,对每个用户进行公钥/私钥身份验证。


密码被一个PHP程序用来连接数据库。 - erenon

2

那么有没有一种预提交钩子来清空敏感字段呢?当然,这假设你首先能够舒适地将文件发送到网络上。

为了处理更新,您可以强制手动合并敏感文件,或修改本地构建过程以用本地/私有/忽略文件中的内容覆盖敏感行。


我在评论中提到了pre-commit hooks,但这种技术只能单向工作。每个开发人员都应该在每次更新和覆盖后更新自己的密码字段。 - erenon

1

我习惯用与config文件结构相同的方式创建一个txt文件。 然后我会复制一份并更改扩展名,让我的版本控制系统忽略这个文件(或文件)。

所以当你更改配置文件时,只需更新其txt版本。 这是我能想到的唯一逻辑选项(在我的看法中)


这种方法违反了DRY原则。不过,它可能会奏效。 - erenon

1

0
在我的项目中,我使用一个目录来保存这些文件,但它没有上传到服务器,所以我的数据库配置文件在那个目录中,并且已经配置为项目所在的服务器。如果有人更改了配置文件,他将更改服务器配置文件,任何更新版本的人都会看到该文件中的更改,并需要手动更改本地配置。
我不知道除此之外还有什么其他方法。如果您找到了不同的方法,请分享一下。

我认为最好将配置文件设置为忽略状态,在修改后,将密码更改为“”,提交更改,然后再次设置忽略标志,最后将“”更改回密码。 - erenon
1
@erenon 看起来很麻烦。我预计开发人员最终会规避这个问题或者不经常提交(无论如何都会提交配置文件)。虽然你可以通过脚本化整个过程来解决这个问题。 - Matthew

0

我曾经做过类似的事情,但我不知道这是否适用于您。我有一个包含密码文件的目录,该目录没有版本控制。这些文件以使用它们的应用程序命名,并在配置文件中,在需要时“source”相应的密码文件。这将要求您的配置解析器能够处理sourcing。


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