8

我不喜欢在 document_root 下存储站点范围的加密密钥和数据库访问信息,所以我使用 Apache 的 SetEnv 和 conf.d 下的 php.ini 文件将它们与代码库分开。最大的问题是,哪个更好?在 apache vhost 文件 ( SetEnv SITEKEY 'oinkoink!') 或 conf.d/xxx.ini 文件 ( db_pass="oink?") 下的环境变量中?也许还有别的?

优点和缺点:

设置环境:

+存储在 DOCUMENT_ROOT 之外
+只有给定的 vhost 可以访问
-PHPINFO() 可见 -黑客需要直接访问/上传漏洞利用到文件

get_cfg_var:

+存储在 DOCUMENT_ROOT 之外
+PHPINFO() 不可见
-(非常糟糕) 包含所有定义的 ini 变量,因此每个 vhost 都可以通过 (ini_get_all) 查询它们,因此在共享 vhost 环境中不可用

4

3 回答 3

5

只要 *.ini 和 SetEnv 在 web 根目录(文档根目录)之外,这两种方式都没有关系。只需选择您喜欢的。我喜欢 SetEnv,但这只是个人喜好。对我来说使用 SetEnv 更有意义,因为变量被放入_SERVER. 对于 .ini,我认为将其留给特定于代码工作方式的初始化设置更有意义。

不存储在文档根目录下是防止访问可能安全数据的好主意。

请注意,这phpinfo()将列出所有设置的服务器变量,所以要非常小心。

最后,如果您包含文件,请确保您不允许../../用户以某种方式无偿设置,否则他们将有权访问潜在的安全文件(甚至包括/etc/passwd!)

我认为您的主要问题是“安全性如何”。好吧,这可能在不引起严重头痛的情况下尽可能安全。php 代码可以访问这些变量,因此如果您将它们打印出来,它们很容易看到,因此这取决于您的代码库的安全性。可能可以将 LDAP 与 MySQL 一起使用,但这听起来很痛苦。

于 2011-07-02T02:11:20.350 回答
1

通常的做法是在 document_root 之外存储非公共文件。一个典型的布局可能是这样的:

.../myProject
.../myProject/documentRoot
.../myProject/documentRoot/.... 
.../myProject/nonPublicFiles
.../myProject/nonPublicFiles/...

将您的 PHP 内容存储在documentRoot中,将所有非公共内容存储在nonPublicFiles中。documentRoot 将是 vHost 的 Apache document_root。由于nonPublicFiles在外面,Apache 不会响应请求。

重新考虑安全性,SetEnv* .ini往往是等效的:如果有人获得执行任意 PHP 代码的权利,两种方式都会为该代码提供合理的信息。

我更喜欢SetEnv*.ini方法,因为 Apache 自己不会透露这些细节。需要一个脚本。

即使没有脚本,错误配置也可能会泄露nonPublicFiles的内容。

如果您要使用nonPublicFiles,请预先准备一个脚本,该脚本会检查一切是否设置好,如果发现问题,请转发电子邮件。可能使用 CRON 调用它。

于 2011-07-02T01:49:47.847 回答
1

我更喜欢将它们存储在只能由 apache 访问的非公共文件夹中,或者存储在 document_root 之外。

于 2011-07-02T03:49:52.633 回答