我应该将敏感文件放在哪里,以便 PHP 脚本可以读取它们?

Posted

技术标签:

【中文标题】我应该将敏感文件放在哪里,以便 PHP 脚本可以读取它们?【英文标题】:Where should I place sensitive files so that they are read-able by PHP scripts? 【发布时间】:2011-11-16 01:29:28 【问题描述】:

我在 Parallels/Plesk VPS 主机上,这是一个非常新手的问题。

webroot 位于:

/var/www/vhosts/my-domain-name/httpdocs

还有一个路径叫:

/var/www/vhosts/my-domain-name/private/

但是 php 脚本似乎无法读取其中的文件。

据我了解,任何放置在 webroot 中的文件,如果其 web-path/filename 请求,都有被提供给公众的危险。我隐约知道使用 .htaccess 文件来告诉 Apache 不要提供某些文件/目录。

但是我可以(或应该)将我的敏感文件放在 webroot 外部的某个位置,同时仍然允许 PHP 脚本读取它吗?

谢谢!

这是我在尝试读取上述“私人”文件夹中的文件时出现的错误:

Warning: file() [function.file]: open_basedir restriction in effect. File(../../private/test.txt) is not within the allowed path(s): (/var/www/vhosts/blah.com/httpdocs:/tmp) in /var/www/vhosts/blah.com/httpdocs/misc/testscript.php on line 8

Warning: file(../../private/test-dt.txt) [function.file]: failed to open stream: Operation not permitted in /var/www/vhosts/blah.com/httpdocs/misc/testscript.php on line 8

更新:已解决

reddit/r/PHPHelp 上的 Picto 为我提供了我需要的东西,并且它是特定于 Plesk 系统的。 我必须编写一个名为 vhost.conf 的文件,并将其放在与 httpdocs 处于同一级别的 conf 文件夹中。在 vhost.conf 中,我使用了:

<Directory /var/www/vhosts/my-domain-name/httpdocs>
php_admin_value open_basedir /var/www/vhosts/my-domain-name/httpdocs:/tmp:/var/www/vhosts/my-domain-name/myfolder
</Directory>

所以我现在将敏感文件放在 webroot (httpdocs) 之外的“myfolder”中。 在此之后,要使这些设置生效,(重新启动 Apache 不起作用)有一些 Plesk 特定的命令要给出,请参阅:http://www.gadberry.com/aaron/2006/02/09/plesk_vhost/

【问题讨论】:

在类似 RedHat 的系统上使 apache 组可读。如果您正在处理 ubuntu,请为该组设置读取权限:www-data 【参考方案1】:

最好将敏感数据存储在 apache 文档根目录之外。

您需要允许 PHP 访问这些文件夹添加或修改虚拟主机配置。

寻找 php_value open_basedir

并添加以冒号 (:) 分隔的文件夹

更多信息open_basedir

注意:open_basedir 存在一些安全问题,详见

http://www.hardened-php.net/advisory_012004.42.html

编辑:

我对每个域都使用这个树结构:

domain/            www-data permisions
├── etc            r-x
├── log            rwx
├── phpCache       rwx
├── phpFiler       rwx
├── phpInclude     r-x
├── phpLogs        rwx
├── phpSession     rwx
├── phpTmp         rwx
├── phpTrash       rwx
├── privat         --- 
├── www443         r-x
└── www80          r-x

etc:用于应用程序配置文件。

日志:用于 Apache 或 nginx 日志文件

phpCache:用于 Zend_Cache 文件

phpFiler:对于应用程序的文件,如果用户有权限,PHP 脚本会为它提供服务。

phpInclude: php_value 包含路径

phpLogs:用于应用程序日志

phpSessions:用于存储这个虚拟主机数据会话。

phpTmp:用于临时文件,例如上传。

phpTrash:phpFiler 的垃圾箱。

privat:用于我的私人用途

www443:用于 https 文档根目录

www80:用于 http 文档根目录

在 open_basedir clausule 中,我放置了除 log 和 privat 之外的所有文件夹。

【讨论】:

您好,corretge,谢谢,但我不太明白您建议将我的敏感文件放在上面的哪个文件夹中,这些文件需要由我的 PHP 脚本读取。 我的问题必须通过 Plesk 特定的信息来解决。我在 Reddit 得到了帮助,还找到了这个页面:gadberry.com/aaron/2006/02/09/plesk_vhost 操作@gus 对不起!应用程序文件的最佳位置是 phpFiler。【参考方案2】:

这意味着,所谓的safe-mode 已生效,它不允许打开给定目录(例如您的特定 webroot)之外的任何文件和目录。这在共享主机上很常见,如果您无权访问 php.ini,那么您很不走运,无法访问 ../private 中的文件。

要访问受保护的文件,请在您常用的httpdocs-目录下方添加一个目录(例如私有),并在其中添加一个带有内容的.htaccess-file

order allow
deny deny from all

这将阻止任何人在不通过您的 php 脚本的情况下访问文件。

最后一点:如果您的 php 文件位于 httpdocs 目录下,则您的脚本需要指向 ../private/test-dt.txt 而不是 ../../private/test-dt.txt

【讨论】:

没有。 open_basedir 设置不受安全模式的影响。安全可以关闭(实际上这更好)open_basedir 限制仍然适用。 关于您的最后一条注释,是的,我知道,我的脚本位于 webroot 的子文件夹中,因此两次“UP”。不过谢谢。【参考方案3】:

将它们放在根文件夹上方。 PHP 脚本仍然可以访问它们,但如果网站被入侵,那么根目录以上的目录应该保持安全。

所以把它们放在像/var/www/vhosts/sensitive-docs/ 这样的地方,并设置目录的权限,以便 PHP 可以读取文件。

【讨论】:

以上是关于我应该将敏感文件放在哪里,以便 PHP 脚本可以读取它们?的主要内容,如果未能解决你的问题,请参考以下文章

我的Man脚本应该放在哪里才能工作?

将我的 PHP 文件放在哪里

我应该把我的 php 文件放在哪里让 Xampp 解析它们?

我应该在哪里编写代码以便 Composer 可以自动加载我的 PHP 类?

我应该将检查用户/通行证的代码放在最顶部还是不放在哪里?

在 MVC 中,我在哪里放置数据库查询?