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

时间:2012-01-31 10:54:42

标签: php mysql security connection-string

我知道规则:永远不要硬编码你的密码,我已经看到了这个问题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());
}

?>
  • 但我需要保护密码,即不在此文件中进行硬编码。我该怎么做?

编辑:对于我得到的所有下注,我仍然没有收到关于真正的安全问题 - 硬编码密码的问题的回复。如果不发布满足问题的评论或答案,对真正的问题进行投票是没有帮助的。

7 个答案:

答案 0 :(得分:1)

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

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

为此配置文件设置git ignore。

答案 1 :(得分:1)

您必须在某处或其他地方对密码进行硬编码。即使您想使用DSN,也必须在DSN字符串中对密码进行硬编码。正如我所看到的那样,密码难以编码。

所以问题归结为你可以做些什么来保护包含密码的文件/字符串。设置适当的文件系统权限到包含密码的文件并设置正确的open_basedir值是你可以做的。正如What's best way to secure a database connection string?中的一篇文章所述,您也可以考虑使用加密分区。

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

答案 2 :(得分:1)

我也正在研究这个话题。文件权限是策略之一,但有很多向量。

但是我们可以说在一个场景中你有FTP或SSH访问服务器,有人破坏了FTP登录。此登录与用户帐户的public_html文件夹相同。那个人可以浏览并阅读这些文件。在这一点上差点很糟糕。但是,您可以在系统上进行配置,仅将用户安装到其主目录。

也许那时你可以在该用户主目录之外的一个级别创建一个.private文件夹。然后在该用户的php文件中,他的脚本在public_html中,包含一个存在于.private文件夹中的连接文件(例如../../.private/connect.php)。

如果用户被判入狱,我不知道这是否会奏效 - 但这种看似安全的事情似乎是一种安全感。

答案 3 :(得分:1)

以Cajus Kuinzinas所躲避的为基础......考虑拥有一个存储应用程序凭据的受限数据库。当您的应用程序启动时,使用只读帐户执行查询,该帐户可以查找实际应用程序数据库的凭据。

为了使其更安全,存储在查找数据库中的值不应该是完整的密码。您的应用程序可以将此值与salt一起散列以生成真实密码。此外,如果需要,您可以将其缓存在内存中,以减少未来的点击量。

答案 4 :(得分:0)

另一种方法,尽管有点不方便,就是在数据库上创建多个帐户,并通过登录屏幕进行用户登录,然后使用自己的凭据为连接字符串供电,这具有讽刺意味的是,它既解决了身份验证又解决了不存储一个简单实例中输入密码。使用良好的密码惯例对于使用哈希和盐仍然是必不可少的。

缺点是,现在数据库上有多个访问帐户,但是,如果数据库打开了审核日志,那么它还使用户审核更加容易。

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

答案 5 :(得分:-1)

将凭据编码到配置文件中是没有问题的。

对于源代码版本化项目,您应该考虑使用占位符为您提交到存储库的任何凭据创建配置模板。

在任何部署中,您应该将这些占位符编辑为实时凭据结帐。如果您打算开源,这也可以帮助任何使用您项目的人。

更新(实际回答问题)

数据库配置确实需要使用纯文本,硬编码到PHP文件中,但是您可以做一些事情以确保它更安全:

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

答案 6 :(得分:-2)

没有理由隐藏您的MySQL密码。只需限制从远程主机访问数据库。或者,您可以为此特定项目/主机/数据库/操作设置没有密码的默认MySQL用户。

要直接回答您的问题,无法模糊密码。