使用SetEnv或php.ini存储数据库变量有多安全?

时间:2011-07-02 01:31:37

标签: php setenv

我不喜欢在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)查询它们,因此不能在共享虚拟环境中使用

3 个答案:

答案 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之外访问。