隐藏git更改中的敏感信息

时间:2015-06-15 19:23:16

标签: git security

有没有办法指示git隐藏我的敏感信息。 E.g。

credentials.php(在本地存储库中)。

Line1: $dbname = 'xyz';
Line2: $dbpassword = 'password';

credentials.php(在github存储库和历史记录中)。

Line1: $dbname = 'xyz';
Line2: $dbpassword = 'xxxxxxxx';

因此git会自动使用'x'隐藏信息。

如果不是通过git,我应该怎么做?我尝试将所有凭据保存在一个地方,但是当您使用第三方库并且他们在整个地方保留凭据时,它变得很难。

旁注:我根本不能跟踪credentials.php文件,因为它可能还包含一些需要版本控制的其他逻辑。

注意:我发现this post有类似的问题。但答案对我来说并不令人满意。是否有一种自动化的方式来完成“已接受的答案”中所说的内容?

3 个答案:

答案 0 :(得分:2)

您可能正在寻找的是过滤器。您可以在.gitattributes文件中设置这些文件,以便在将文件添加到临时区域时运行一个替换,并在结帐时进行另一次替换:

enter image description here

图片来自Git book的.gitattributes部分,其中详细介绍了如何创建此类过滤器。

答案 1 :(得分:2)

一个常见的解决方案是将一个文件credentials.example.php添加到存储库中,该文件不包含任何真实凭据,只包含用于指定它们的通用格式,以向其他人展示如何创建真实 credentials.php。因为该文件随后会被.gitignore文件忽略,因此不会添加到存储库中。因此,您可以将实际凭据放在那里进行开发甚至部署。

缺点是您可能需要在文件更改时将格式更改同步到两个文件中。但是你应该尝试保持这样的凭证(或配置)文件真正简洁,所以它不应该经常改变。

另一个解决方案是拥有两个配置文件,例如credentials.default.phpcredentials.user.php,其中前者被检入存储库,后者再次被忽略。然后程序尝试加载(按顺序),因此您可以覆盖用户文件中的内容,但不需要重新指定所有内容。因此,如果您有许多配置,哪些默认设置是理智的(它们应该),那么您可能只需要覆盖一些重要配置(如凭据),因此您只需在用户文件中指定这些配置。

答案 2 :(得分:0)

我最终使用poke's答案的变体。 请将所有选票重定向到他的答案。

我使用env变量来解决我的问题。 Laravel(我使用)使用phpdotenv framework来处理env变量。

在我的所有配置文件中,我编写了env('USERNAME')env('PASSWORD')等变量,我还在项目的根目录中定义了一个.env文件。

.env文件的示例内容

USERNAME=rash
PASSWORD=pass
... Other key-value pairs.

在运行时,在配置文件中,所有这些键都将被此文件中定义的值替换。

我还定义了一个.env.example文件,我保存了我的样本数据。

.env.example文件的示例内容

USERNAME=PUT_USERNAME_HERE
PASSWORD=PUT_PASSWORD_HERE
...

然后我版本控制这个文件。任何使用我的项目的用户都会复制此文件,将所有值替换为自己的值,并将该文件重命名为.env。然后项目顺利进行。

这解决了我的问题,因为:

  1. 我的配置文件中没有敏感信息。每个配置文件都包含env(' USERNAME')等值。实际敏感信息位于.env文件中。因此,我可以对我的conf文件进行版本控制。
  2. 由于我也传递了.env.example文件,因此另一端的用户确切地知道需要在适当的字段中添加什么。
  3. 我有多少conf文件并不重要。我可能有100个文件,但这个解决方案仍可以完美运行。