2010-07-28 24 views
34

很多PHP程序都要求用户在应用程序根目录的配置文件中以纯文本(字符串或常量)存储mysql密码,这一直困扰着我。比在配置文件中以纯文本方式存储mysql密码更好的方法吗?

这些年来有没有更好的办法呢?

到目前为止,我已经提出了两个最低的安全性提升:(万一

  1. 使文件通过使用规则的.htaccess 网页不可读PHP失败,或者有一个安全漏洞阅读PHP源)

  2. 在存储器破坏密码分贝后连接的情况下(未设置) (防止串从安全漏洞,注射等)

转储

但当然这些解决了原来的问题。

感谢您的任何其他想法!

+0

技术上不是答案,但您可以配置mysql以仅接受可信来源,例如只有unix域套接字,或者只使用正确的SSL证书。 Ontopic:请参阅我的答案以了解如何不存储文字密码。 – mvds 2010-07-28 15:27:39

+0

你有没有考虑过一些'备份(tgz | zip)'文件存在的可能性,包含密码? – mvds 2010-07-28 15:48:14

+1

甚至比本地备份还要糟糕,因为我会问这些问题,因为纯文本只是迟早的乞求 – 2010-07-28 15:55:54

回答

11

由于您的代码将需要密码,因此没有完美的安全性。但是你可以很难恢复。

我把一些散在我的web配置,为环境变量,说MYSQL_PASS_HASH

然后,我像做md5(getenv('MYSQL_PASS_HASH').'gibberish$qwefsdf'),然后将其密码。当然,如果你偏执,你应该在unsetenv之后。

您的密码不会真正存储在某个地方,只有当您的数据库包含Web配置时,才能恢复。

这发生在webroot以外的文件中(请勿将您的所有信任放在.htaccess之内)。

+0

我认为这是迄今为止的第一个答复,这是对纯文本的真正改进。接下来的问题会让其他用户很容易地配置。 (在webroot之外移动并不总是可能的,因为如果它可以包含,file_get_contents也可以在它上面工作)并不是真正的解决方案 – 2010-07-28 15:33:58

+10

-1:通过隐藏安全 – symcbean 2010-07-28 15:35:32

+1

@symcbean:为什么?我在这里发布它,就像我在自己的服务器上配置它一样!这不是晦涩难懂的,但发表在所有地方的SO!我只是将风险分散在两个文件中,这两个文件都不应该是可访问的,并且不应该**这两个**都是同一备份的一部分,**加上**不以明文形式存储它。 – mvds 2010-07-28 15:46:15

12

将配置文件保存在文档根目录之外是改进配置文件安全性的常用方法。

+3

我只是在输入文本。我要指出的是,如果不是大多数共享主机不允许他们的客户访问文档根目录之外的任何内容,很多情况下都会指出这一点。 – 2010-07-28 15:10:33

+0

仍然有文字密码存储在某个文件的某处。这比你需要承担的风险还要高。 – mvds 2010-07-28 15:49:15

+0

Peter O'Callaghan,我有专用的服务器,甚至我不能在文件根目录 – 2016-01-25 19:20:44

0

它不必位于webroot中。您可以将文件移动到webroot之外并以此方式进行调用。这只是意味着文件不能直接从网络中调用。

如果您的代码存在安全漏洞,比如包含没有从GET数据中过滤的东西,那么该文件仍然存在风险。真正的关键是确保你的应用程序也是安全的。

25

个人而言,我在我的Web文件夹根目录外的config.ini文件中存储敏感信息,例如数据库连接详细信息。然后在我的index.php 可以做:

$config = parse_ini_file('../config.ini'); 

这意味着变量是不可见的,如果你的服务器意外开始输出PHP脚本为纯文本(这以前也发生过,臭名昭著至Facebook);只有PHP脚本才能访问这些变量。

这也是对的.htaccess在那里,如果你的.htaccess文件被移动或破坏没有意外不依赖。

警告,2017年2月14日添加:我现在将配置参数存储为环境变量。我现在还没有使用.ini文件的方法。

0

如果您愿意为文件安全权衡可用性,可以将密码从配置文件中取出,并要求管理员在引导时将其键入并将其存储在全局变量中。

您仍然必须确保自己可以安全地避免可能转储该变量的注入式攻击,当然您在(重新)引导过程中还有一个手动步骤。

+0

之外存储。不幸的是,这在一个典型的PHP/MySQL应用程序中是不可能的。 – 2010-07-28 15:45:35

+0

同意,但我认为这是一个值得列出的解决方案。 – Greg 2010-07-28 18:25:46

2

当然,您不应该在文档根目录中的纯文本文件中存储密码。你采取什么进一步的步骤来保护它将取决于你必须配置你的网络服务器的访问级别。

您可以在php.ini中定义密码(或通过Apache配置或.htaccess中的ini设置)。或者在启动Web服务器时将其设置在环境中。

加密密码没有意义 - 这意味着您需要存储解密密钥 - 除非您使用用户提供的密码与仲裁身份验证来解密密码(但这可以防止未经身份验证的会话访问数据库,当你需要将新用户添加到仲裁时会变得麻烦)。

如果它是一个便宜的托管软件包,并且在文档根目录之外没有可访问的存储空间,那么将密码存储在一个php包含文件中应该防止它被暴露(文件将被下载的php intead解析)。或者,在开始时用“.ht”命名文件可能会阻止远程访问。

注意你的第二个选项有点多余 - 如果有人可以对你的代码做很多的损害,那么他们不需要从正在运行的代码中提取密码。

真的没有解决方案的问题。

C.

+0

和你一样,我认为这是一个鸡/鸡蛋的问题,但我想看看这里的一些伟大的思想能够提出什么。 – 2010-07-28 15:48:01

+0

在某种形式的加密中显然存在一点,保留两个(或更多)部分以尽可能恢复分离的密码。 (例如'/ etc'下的一部分,另一部分包含在你的包含路径中,但不包含在你的webroot中) – mvds 2010-07-28 15:52:18

2

除了正常存储这些敏感数据,你也应该create a separate MySQL user只具有所需的privileges and restrict the access到它需要访问数据库/表/视图。由于数据库服务器通常与Web服务器在同一台计算机上运行,​​因此也要限制对本地访问的访问。因此,如果只需要从单个数据库/表中读取数据,请不要使用具有超级用户权限的用户。

+2

很好的提示限制权限 - 因为许多PHP应用程序采取懒惰的方式,并且让用户只配置一个MySQL登录,它可以创建表格等等。但是,当然,即使是较小的权限仍然需要在大多数应用程序中编写,并且可以用这种方式完成很大的损害。 – 2010-07-28 15:43:52

相关问题