2009-06-13 75 views
5

第一次读者,第一次海报(宇!)将PHP登录信息存储在PHP代码中存在安全风险?

所以我一直在实施我的登录脚本的非正式网站。不太可能会受到影响,但为了安全起见,我想问问在PHP代码中以明文形式存储MySQL数据库登录时是否存在安全风险。

据我所知,代码本身是由Apache解析的,所以最终用户没有看到它(只是输出),这意味着它应该是安全的保持...但我会像第二种意见。

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

安全漏洞?

回答

10

您也可以考虑将用户名/密码组合移至位于webroot之外的单独配置文件。确保该地点不能从网络服务器端直接访问。

这样,如果由于某种原因网络服务器决定不再执行PHP文件,则不会将帐户信息丢失到数据库服务器。作为一个额外的好处,如果您使用任何在webroot中创建.php文件(编辑器,SVN或其他)的副本,您不会冒任何绕过.php执行的风险。

+6

真相。当我第一次开始使用linux时,没有注意到Gedit制作了filename.ext〜当我上传文件夹时,〜文件将与它一起。然后,我可以去mysite.com/index.php~那里它是纯文本 – sqram 2009-06-13 20:57:14

+2

@lyrae:我...好主,谢谢你指出。我不知道... O.o *运行并删除* – 2009-06-14 00:28:30

+0

如果你绝对必须在PHP文件中有密码,那么至少应该是sha1或md5。 – Shoan 2009-06-14 04:03:36

0

任何人都可以在该Web服务器上以root权限登录(或者也可能稍低一些)将能够看到您的密码 - 但是,对于超级用户(无论您身在何处)保持你的密码,他们可以破解并找到它)。除了这个风险,你应该是安全的。

编辑:如果您的密码在.php脚本中清晰可见,那么也可以使用服务器的备份(如果未加密或由可以解密他们的人)恢复密码。通过将密码保存在不同的安全位置,并且只在严格限制的情况下(安全地)发送密码,这种可能的攻击可能会被缓解(对于很大的不便/成本)。这是你害怕的那种攻击吗?

7

这是针对与数据库交谈的Web应用程序的非常标准的过程。

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

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

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

当然,如果你的盒子受到攻击并且攻击者获得root访问权限,那么很少有人会保护你。

+2

+1 - 确保MySql用户没有drop/grant等权限也是个好主意。 – karim79 2009-06-13 20:33:28

1

你可以添加一些额外的安全层,把所有的php文件(当然除了index.php)放在一个单独的目录下,用.htaccess文件保护它们。这涵盖了php分析器未被调用并且apache以明文形式返回文件的情况。还有一件事可能是有用的:<?php defined('some_id_here') or die(); ?>。你可以把它放在除index之外的每个php文件的顶部。PHP(你定义some_id_here),所以没有直接访问你的数据库文件。

1

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

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

以深度防御

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

我不知道如何连接到你的MySQL数据库,但是如果你使用PDO存在该PDO构造函数抛出异常的可能性。 如果你不知道这个例外,Zend引擎会默认显示回溯,并显示你的连接细节!

将连接信誉存储在php文件/变量中,或者在这种情况下,您可以使用DSN(数据源名称)中的PDO,这是正常的。我甚至会建议你把它放在一个php文件中,因为它会被解析并且不会传送到网络上...

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

但是在我的服务器上,不可能从本地主机连接而不是。所以我不在乎是否有人读取我的登录信息(当然不是这种情况)。