我不喜欢在document_root下存储全站点加密密钥和数据库访问信息,所以我在conf.d下使用Apache的SetEnv和php.ini文件将它们与代码库分开。最大的问题是,哪一个更好? apache vhost文件(SetEnv SITEKEY 'oinkoink!'
)或conf.d / xxx.ini文件(db_pass="oink?"
)下的内部环境变量?也许别的什么?
PROS n CONS:
SETENV:
+存储在DOCUMENT_ROOT外面
+只有给定的vhost才能访问
-Visible与PHPINFO() - 黑客需要直接访问/上传利用文件
get_cfg_var:
+存储在DOCUMENT_ROOT外面
+ PHPINFO()不可见
- (非常糟糕)包含所有已定义的ini变量,因此每个vhost都可以通过(ini_get_all)查询它们,因此不能在共享虚拟环境中使用
答案 0 :(得分:4)
只要* .ini和SetEnv在Web根目录(文档根目录)之外,无论哪种方式都无关紧要。只需选择您喜欢的任何一种。我喜欢SetEnv,但这只是个人喜好。因为变量被放入_SERVER
,所以使用SetEnv对我来说更有意义。使用.ini,我认为将其留给特定于代码工作方式的初始化设置更有意义。
不存储在文档根目录下是一个好主意,以防止访问可能安全的数据。
请注意phpinfo()
将列出所有已设置的服务器变量,因此请务必小心。
最后,如果您要包含文件,请确保您不允许用户以某种方式设置免费../../
,否则他们将有权访问可能安全的文件(甚至包括/etc/passwd
!)< / p>
我认为你的主要问题是“多么安全”。嗯,这可能就像你能得到的那样安全而不会引起严重的麻烦。 php代码可以访问这些变量,因此如果您将它们打印出来,它们很容易看到,因此它取决于您的代码库的安全性。有可能将LDAP与MySQL一起使用,但这听起来很痛苦。
答案 1 :(得分: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调用它。
答案 2 :(得分:1)
我更喜欢将它们存储在非公共文件夹中,只能由apache访问,或者在document_root之外访问。