【问题标题】:Only allow access to files in directory from the website they are a part of只允许从它们所在的网站访问目录中的文件
【发布时间】:2020-06-18 00:44:48
【问题描述】:

我知道那里有很多类似的问题,我已经全部搜索过了,但我似乎无法找到任何有效的解决方案。

我的网站根目录中有一个文件夹,其中包含用户登录时可以从该网站查看和下载的上传文件。它们在这里:https://example.com/uploads(例如)。我需要网站继续能够访问它们以显示它们(有些是图像)并提供下载链接(pdf 等),以便用户可以下载它们,但我想避免任何人掌握 a 的 url可以直接下载它们的特定文件,例如:https://example.com/uploads/2020/02/myfile.pdf。或者这些 url 进入搜索引擎(或者如果它们进入,服务器会阻止它们被直接访问。

我尝试在上传目录中添加一个 .htaccess 文件,内容如下:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

我试过了

Order Allow,Deny
Deny from all
Allow from 127.0.0.1

...据我所知,这可能允许来自站点本身以及本地 url 的 HTTPS 调用。

但是它禁止站点和直接的url请求,这不好。

有没有办法做到这一点?

【问题讨论】:

  • 图片不是由您的站点“请求”的,它们仍然是由用户的浏览器请求的。所以这些请求不会来自127.0.0.1
  • 好吧,我想当你这样说的时候它是有道理的,是的......那么有没有办法将两者分开?
  • "...当用户登录时" - 那么,这些文件当前是否受到某种用户身份验证的保护?虽然,从它的声音来看,它们还没有而且仍然是公开的?他们大概没有链接到面向公众的网页?
  • 提供对文件的“官方”访问权限的用户界面具有用户身份验证,是的,但是文件仍然存在于目录中,如果知道 url,则不会阻止任何人访问它们。这有意义吗?

标签: apache .htaccess server


【解决方案1】:

提供对文件的“官方”访问权限的用户界面具有用户身份验证,是的,但是文件仍然存在于目录中,如果知道 url,则不会阻止任何人访问它们。

您需要使用您用来保护对用户界面的访问的相同身份验证系统来保护文件。您可以通过 IP 地址(client IP 地址)保护这些资源的唯一方法 - 正如您目前在 .htaccess 中尝试的那样 - 是如果客户端的 IP 是固定的并且事先已知(但如果这如果是这种情况,那么您就不需要其他形式的身份验证了)。

因此,这将主要是使用任何脚本语言/CMS 来验证“用户界面”的练习。

您可以使用.htaccess 将这些文件的请求重写到处理身份验证的服务器端脚本,然后在通过身份验证后将文件提供给客户端。

例如:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^uploads/. /serve-protected-file.php [L]

任何映射到有效文件的/uploads/<something>(例如/uploads/2020/02/myfile.pdf)请求都会路由到您的脚本:/serve-protected-file.php

/serve-protected-file.php 然后需要执行以下操作:

// 1. Parse the file being requested from REQUEST_URI

// 2. Is the requested file "protected"?
//    (Serving both protected and public files from the same directory?)

// 3. If not protected then serve/stream the resource to the client. END

// 4. If protected then authenticate the user...

// 5. If user authenticated then serve/stream the resource to the client. END

// 6. Resource is protected and user not authenticated...
//    Serve a 403 Forbidden. END

(理想情况下,这些“受保护”资源的位置将完全位于文档根目录之外 - 因此默认情况下它们是“私有”的 - 用户用于访问这些资源的 URL 完全是虚拟的 - 那么您可能会'不需要在.htaccess 中进行任何额外的编码,一切都将由您的前端控制器实现 - 但这一切都取决于您的网站的实现方式以及 URL 的路由方式。)

【讨论】:

  • 这看起来很完美!我会尝试并报告!感谢您抽出宝贵时间。
  • 非常完美。如此出色的解释,涵盖了 .htaccess 部分和处理文件部分。整个解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多