在PHP代码中存储SQL登录信息的安全风险?

时间:2009-06-13 20:17:10

标签: php mysql security plaintext

第一次读者,第一次海报(喔!)

所以我一直在为非正式网站实现我的登录脚本。不太可能受到损害,但为了安全起见,我想问一下,如果在MySQL代码中以明文形式存储我的MySQL数据库登录存在安全风险。

据我所知,代码本身是由Apache解析的,所以最终用户看不到它(只是输出),这意味着它应该是安全的......但是我想要第二个意见。

要点: 通过mysql_connect,mysql_select_db,mysql_query访问数据库。登录信息存储在脚本每次迭代时定义的局部变量中,并且(我认为)一旦脚本终止就转储。

安全漏洞?

6 个答案:

答案 0 :(得分:10)

您还可以考虑将用户名/密码组合移动到位于webroot之外的单独配置文件中。确保无法从网络服务器端直接访问该位置。

这样,如果由于某种原因,网络服务器决定不再执行PHP文件,您不会丢失数据库服务器的帐户信息。

作为一个额外的好处,如果你在webroot中使用任何制作.php文件(编辑器,SVN或其他)副本的东西,你就不会冒任何人绕过.php执行的风险。

答案 1 :(得分:7)

这是与数据库通信的Web应用程序的非常标准的过程。

我建议为Web服务器以外的用户和您自己的用户取消读取权限 - 如果您的盒子上有其他用户可以监视该文件,他们将能够访问您的mysql服务器。

此外,您应该调整顶级目录的可执行权限,因为它可以防止未经授权的用户甚至输入它。

强化你的mysql用户允许的主机,这样只有你需要的盒子才能连接到它。

当然,如果你的盒子遭到攻击并且攻击者获得了root访问权限,那么几乎没有什么可以保护你。

答案 2 :(得分:1)

您可以通过将所有php文件(当然除了index.php)放在一个单独的目录中来添加一些额外的安全层,并使用.htaccess文件保护它们。这包括不调用php解析器的情况,apache以明文形式返回文件。还有一件事可能有用:<?php defined('some_id_here') or die(); ?>。您可以将它放在除index.php(您定义some_id_here)之外的每个php文件的顶部,这样就无法直接访问您的数据库文件。

答案 3 :(得分:1)

在webroot中没有大量代码,尽管不太可能,但这只是可以采取的第一道防线。

即使数据库用户和密码已发布,您的数据库也应该是安全的 - 只需允许少量源计算机连接到数据库。

深度防御

<?php  // simplest /index.php, as the only .PHP file in the public-accessible webroot
require '../bootstrap.php';

答案 4 :(得分:1)

我不知道你如何连接到你的MySQL数据库,但如果你使用PDO,PDO构造函数可能会抛出异常。 如果您没有捕获此异常,Zend Engine将默认显示回溯并显示您的连接详细信息!

将连接信息存储在php文件/变量中,或者在DSN(数据源名称)中使用PDO,这是正常的。我甚至建议你把它放在一个php文件中,因为它会被解析而不会发送到网上...

更安全的一步是将登录详细信息放在www-root之外,或者使用.htaccess文件保护它(这样就无法通过网络服务器访问该文件)。

但是在我的服务器上,无法从localhost连接而不是。所以我不在乎是否有人读取我的登录详细信息(当然不是这样。)。

答案 5 :(得分:0)

任何能够在该Web服务器上以root权限登录的人(或者可能稍微低一些)都能够看到您的密码 - 但是,基本上不可能防御超级用户(无论您在哪里保留其他用户)你的密码,他们可以破解并找到它)。除了这种风险,你应该是安全的。

编辑:也可以使用服务器的备份(如果未加密,或者由可以解密它们的人)来恢复密码,如果它在.php脚本中是明确的。通过将密码保存在不同的安全位置,并且仅在严格限制的情况下(安全地)发送密码,可能可以减轻这种可能的攻击(极大的不便/成本)。这是你害怕的那种攻击吗?