如何在PHP中保护mySQL连接字符串?

8

我知道这个规则:千万不要硬编码密码,我看到了这个问题 here,它解释了如何在 Java 和 MySQL 中做到这一点,但我不知道该如何在 PHP 和 MySQL 中实现。

当前的连接字符串是这样构建的:

<?PHP

$DBName = "dbName";
$Host = "localhost";
$User = "dbUser";
$Password = "Yikes_hardcoded_PW";

$Link = mysql_connect( $Host , $User , $Password , $DBName);

if (!$Link) {
    die('Could not connect: ' . mysql_error());
}

?>
  • 但我需要将密码保护起来,即不要在这个文件中硬编码。我该怎么做?

编辑:尽管我收到了很多负评,但我仍然没有得到答案,因为这是一个真正的安全问题 - 硬编码密码。在没有发布符合问题的评论或答案的情况下,对一个真正的问题进行负评是没有帮助的。


2
好的,不要在代码中放置密码。如果是开源的,没有人需要密码。 - Rene Pot
2
将其放入单独的配置文件中,并在GIT中忽略它。 - Bogdan
你可以像Bogdan建议的那样将密码放在一个单独的文件中,并在开发过程中将其添加到gitignore中。对于开发来说,只需将密码保留在dsn中可能更容易。选择哪种方式取决于您的舒适水平。对于生产环境,请将密码保存在您的代码将执行的生产服务器上。限制对该服务器的访问,并通过chef、puppet、fabric等工具管理密码的设置/重置。 - dminer
7个回答

1

将您的配置存储到另一个文件中。

$DBName = "dbName";
$Host = "localhost";
$User = "dbUser";
$Password = "Yikes_hardcoded_PW";

为此配置文件设置git忽略。


1
配置文件在另一个文件中,是的,Git 可以忽略文件,但这并没有回答我的问题。 - T9b

1

在Cajus Kuinzinas的基础上进行完善...考虑使用一个受限制的数据库来存储应用程序的凭证。当您的应用程序启动时,使用只读帐户执行查询,可以查找实际应用程序数据库的凭据。

为使其更加安全,查找数据库中存储的值不应为完整的密码。您的应用程序可以使用盐与哈希此值以生成真正的密码。如果需要,还可以将其缓存在内存中,以减少未来的访问。


1
我也在研究这个话题。文件权限是其中一种策略,但是有很多漏洞。
假设你拥有FTP或SSH访问服务器的权限,但是有人攻击了FTP登录。该登录与用户帐户的public_html文件夹相同。那个人可以浏览并读取这些文件。这时情况变得非常糟糕。但是,您可以在系统上配置一个选项,将用户限制在其主目录下。
也许您可以在该用户主目录之外的上一级创建一个.private文件夹。然后,在该用户的php文件中(他的脚本位于public_html中),包含一个存在于.private文件夹中的连接文件(例如../../.private/connect.php)。
我不知道如果用户被限制在主目录下是否会起作用-但这似乎是通过模糊保密来实现安全的一种方式。

1

你必须在某个地方硬编码密码。即使你想使用DSN,你也必须在DSN字符串中硬编码密码。我认为无法避免硬编码密码。

因此,问题归结为如何保护包含密码的文件/字符串。设置包含密码的文件的适当文件系统权限和设置适当的open_basedir值是你可以做的。正如What's best way to secure a database connection string?中的一篇帖子所提到的,你还可以考虑使用加密分区。

你在问题中发布的链接,就我理解而言,谈论的是桌面应用程序。PHP桌面应用程序太少了,无法认真考虑保护php桌面应用程序的数据库密码问题。


0

另一种方法,虽然有点超出常规,是在数据库上创建多个帐户,并通过登录屏幕让用户登录,然后他们自己的凭据驱动连接字符串,这反而解决了身份验证和不在一个简单实例中存储密码的问题。使用良好的密码实践仍然至关重要,使用哈希和盐。

缺点是现在数据库上有多个访问帐户,但作为加分项,如果您的数据库已打开审计日志,则还可以使用户审计变得更加容易。

您需要编写一些逻辑来处理会话中的凭据,但这是将凭据存储在字符串中的替代方法。


-1

将编码凭据放入配置文件中并没有问题。

对于源代码版本化的项目,您应该考虑创建一个配置模板,其中包含任何凭据的占位符,这些凭据将提交到您的存储库中。

在任何部署中,您都应该编辑这些占位符以获取实时凭据。如果您要开源项目,这也将帮助任何使用您的项目的人。

更新(实际回答问题)

数据库配置确实需要以纯文本形式硬编码到PHP文件中,但是您可以采取一些措施来确保其更安全:

  1. 检查您的Apache配置,open_basedir限制其他vhost实例无法访问其Web根目录之外的文件
  2. 检查文件系统权限,以确保仅有Apache和您的用户可以访问该文件
  3. 确保您的mysql用户仅设置为在localhost上下文中有效,即grant all privileges on mydatabase.* to myuser@localhost
  4. 使用防火墙阻止对mysql的外部连接

问题不在于版本控制方面,而是关于如何保护密码以供PHP使用。你能给我一个回答问题的例子吗? - T9b
确保您的文件系统权限正确,这是最重要的。只要您和Apache可以访问它,您就应该没问题了。还要确保Apache中的open_basedir配置正确。此外,如果您的MySQL创建用户语句仅指定user@localhost,则会更加安全。 - Paul Bain

-2

没有必要隐藏你的MySQL密码。只需限制远程主机对数据库的访问即可。或者,你可以为此特定项目/主机/数据库/操作设置一个默认的无密码MySQL用户。

直接回答你的问题,没有办法混淆密码。


不隐藏密码似乎违背了公认的智慧。我并没有要求密码被混淆,只是要保证安全。 - T9b
@T9b,如果远程访问受限制,那么请使用默认用户且不设置密码。但是,如果没有必要隐藏MySQL密码,例如参见http://www.opensourcecms.com/,一些托管的CMS允许更改数据库设置,用户也能够看到密码并且他们非常清楚这一点。 - Gajus

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