如何处理将来将包含敏感数据的文件



我有一个包含数据库密码的文件db/connect.php

我创建了该文件并为其提供了没有密码的结构:

<?php
$db_host = "localhost";
$db_user = "";
$db_pw = "";
$db_name = "";
$con = new mysqli($db_host, $db_user, $db_pw, $db_name);
/* check connection */
if ($con->connect_errno) {
printf("Connect failed: %sn", $con->connect_error);
exit();
}

然后我提交了文件。在下一次提交中,我将文件添加到.gitignore.

但我注意到它还是被跟踪了。 我发现 git 会跟踪存储库中已有的所有文件,所以唯一的方法是用git rm --cached db/connect.php删除它,但是克隆存储库的用户将需要再次创建它......??

我的问题不是关于重写 git 历史记录,存储库中没有敏感信息。我的问题是如何提供文件结构但在那之后不跟踪它,以便文件中输入的任何内容都不应该被跟踪......

如何解决这个问题?

此处的正确方法是将模板文件存储在存储库中,并提供说明或自动在本地创建实际文件的方法。这个实际的文件将被.gitignore忽略,而模板文件将像任何其他文件一样被跟踪。

例如,您可以使用此内容创建一个名为connect_credentials.php.template的文件(请记住,我对 PHP 一无所知,所以下面的根本不是真正的 PHP,只是复制粘贴和对您的问题进行轻微编辑):

<?php
$db_host = "localhost";
$db_user = "";
$db_pw = "";
$db_name = "";

如果你能在这个模板文件中提供有用的默认值,那就更好了,否则让它完全不起作用,并迫使程序员修复某些东西。

此文件将正常跟踪,然后您将提供说明或自动方法从此文件复制到真实文件,connect_credentials.php。但是,文件将在.gitignore中被忽略:

connect_credentials.php

并且从未跟踪过。程序员在克隆或更新后,需要从模板自己创建此文件,并进行编辑以匹配本地开发环境。

该文件可以是真实的代码文件,例如 php 文件,也可以是您读取的配置文件,例如 ini 文件、json 或 xml 文件、yaml 或类似文件,但无论实际文件类型或内容如何,相同的方法都很有用。跟踪模板,忽略实际文件。这使程序员也能够看到此文件的格式并了解其更改,例如新的配置选项。


不幸的是,由于您已经在那里创建了真正的文件,因此我认为您需要决定如何处理它。正如您所注意到的,如果您现在删除文件以停止跟踪它,则任何更新其个人存储库和工作文件夹的人也将丢失该文件。您可能需要考虑为实际凭据创建一个新的单独文件,如我上面给出的示例所示,以避免此删除问题。

你只是告诉 Git 停止跟踪以前跟踪的文件。因此,您仍然可以访问此文件的修订版本,直到您告诉 Git 忽略它为止。

如果有敏感数据的修订,您可以使用git rebasegit filter-branch重写 Git 历史记录。

⚠️ 如果您需要将每个提交都保留为"工作"提交(例如,如果您要回滚到之前已重写的提交,那么重写历史记录可能是一项危险的练习,您有什么保证它仍然"有效"?)。此外,重写共享历史记录可能会使您的协作者(或您自己的)分支面临非平凡合并冲突的风险。

话虽如此,我认为您不应该将凭据放在源文件中。使用可以在项目设置或构建过程中生成的配置文件(json、yaml、ini),并使该文件远离 Git(即忽略它)。

此外,您可以使用 Git 挂钩来拒绝任何将这些类型的文件提交到 Git 存储库的尝试。

一个简单的解决方案是创建一个文件,例如database.template.php,向其添加内容,但为其添加简单的默认值(例如$db_host ="localhost"; $db_user="root"; ...)。将database.php添加到忽略文件。指示存储库用户将模板文件复制到database.php并在本地进行配置。

另一个更危险的选择是不将文件添加到忽略列表中,并且存储库用户在更新文件时只需忽略索引中的更改:

git update-index --skip-worktree path/to/file

但是,这更危险,因为存储库用户无论如何都更有可能意外签入文件。

解决方案很简单: 不要在 GIT 中存储敏感凭据。 将敏感数据移动到配置文件或环境变量。如果是文件,切勿将其签入,但无效的"演示"文件除外。如果使用 env 变量,请添加自述文件,说明需要哪些变量。

使用库在运行时读取配置数据,在需要密码的地方使用。

最新更新