【问题标题】:Make file only accessible for php使文件仅可用于 php
【发布时间】:2016-07-31 07:57:23
【问题描述】:

我想让特定目录中的文件只能供php访问,具体情况是,我有一个文件夹,里面有一些子文件夹,每个子文件夹都包含很多文件(可以是每种类型的文件,比如图像、代码、可执行文件等)。现在我构建了一个能够下载文件的脚本,它可以工作,但也有可能只去server.com/folder/subfolder/img.jpg 来查看图像。这是我不想允许的。

有什么办法可以做到吗?

PS:我正在运行带有 apache2 和 PHP7 的 Ubuntu 14.04 服务器。

编辑:问题可能与链接的问题重复,但没有答案对我有用,.htaccess 不会改变任何东西,文件夹应该保持原位。

【问题讨论】:

  • 你尝试了错误的方法。文件系统内部权限处理解决了类似的问题,这是不可能的。相反,您使用“路由器脚本”来处理对任何此类文件的请求,而文件本身无法通过直接 http 请求完全访问。它们存储在已发布的文件树部分之外。路由脚本可以使用您想要授权请求的任何策略,然后通过首先发送适当的 http 标头然后发送文件内容本身来“分发”文件。
  • @arkascha 为什么 .htaccess 文件没有“拒绝所有”的工作呢?
  • 当然可以,但您必须再次对某些文件实施例外。但我不会认为这是一个安全或优雅的解决方案。它将您的应用程序逻辑分布在您的设置中的不同级别,并要求所有组件完美地协同工作。如果没有,您有安全或数据泄露。 .htaccess 样式文件是出了名的容易出错,难以调试,而且它们确实减慢了 http 服务器的速度。而在路由脚本中,您可以使用脚本语言提供的所有灵活性。记录、修改、一对多方法……
  • @arkascha 所以你认为我可以将包含子文件夹和文件的文件夹移动到浏览器无法访问的另一个文件夹中(所以在/var而不是/var/www

标签: php apache2 privileges access-control


【解决方案1】:

这可以解决问题:

RewriteEngine On
RewriteBase /yourwebsite/

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

ErrorDocument 404 /yourwebsite/404.php

把它放在你的 .htaccess 中,当有人访问你的网站时,他们只会看到公用文件夹中的内容,但公用文件夹之外的所有内容仍然可以通过 php 访问,只有图像和 css 必须在公用文件夹内,否则用户看不到,因为他没有权限

【讨论】:

    【解决方案2】:

    如果您想使用文件系统解决这个问题,您必须认识到您在系统方面存在一些重大限制。例如,您的 PHP 脚本无法以与 Apache 相同的用户身份运行,因此无法在 Apache 中运行。

    如果这是一个硬性要求,我要做的第一件事是通过 fcgi 守护程序而不是 Web 服务器运行 PHP 脚本,让其作为单独的用户运行,并相应地收紧文件权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-20
      • 2014-12-09
      • 2013-01-20
      • 2011-09-19
      • 2017-10-03
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多