我应该将敏感文件放在哪里,以便 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 脚本可以读取它们?的主要内容,如果未能解决你的问题,请参考以下文章
我应该把我的 php 文件放在哪里让 Xampp 解析它们?