5

第一次阅读,第一次海报(哇!)

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

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

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

安全漏洞?

4

6 回答 6

10

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

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

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

于 2009-06-13T20:27:52.740 回答
7

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

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

此外,您应该调整顶层目录的可执行权限,因为它会阻止未经授权的用户甚至进入它。

加固您的 mysql 用户允许的主机,以便只有您需要的盒子可以连接到它。

当然,如果您的机器被入侵并且攻击者获得了 root 访问权限,那么几乎没有什么可以保护您。

于 2009-06-13T20:20:55.847 回答
1

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

于 2009-06-13T20:35:26.433 回答
1

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

即使发布了数据库用户和密码,您的数据库也应该是安全的 - 通过仅允许少量源计算机连接到数据库的简单权宜之计。

纵深防御

<?php  // simplest /index.php, as the only .PHP file in the public-accessible webroot
require '../bootstrap.php';
于 2009-06-13T20:39:23.460 回答
1

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

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

提高安全性的一个步骤是将登录详细信息放在 www-root 之外或使用 .htaccess 文件保护它(这将导致无法通过网络服务器访问该文件)。

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

于 2009-06-13T23:47:01.060 回答
0

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

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

于 2009-06-13T20:20:37.810 回答