【问题标题】:Make URL inaccessible for everything but a specific Webpage使除特定网页之外的所有内容都无法访问 URL
【发布时间】:2018-01-12 00:17:03
【问题描述】:

对于文件传输系统,我将数据存储在我的服务器上。可以使用 URL 访问数据,例如:

http://filestorage.example.com/files/clientfiles/clientid/test.pdf

clientid/文件夹内的所有文件都链接在为客户端生成的下载页面上,例如:

http://example.com/download.php?clientid=28692692846

上面的 URL 包含一个网页,其中包含指向 clientid 文件夹中所有文件的多个链接:

<a href="http://filestorage.example.com/files/clientfiles/clientid/test.pdf" download>
test.pdf
</a>

现在我想限制对文件的访问。从外部访问文件应该是不可能的,它们应该只能从 download.php 访问。 甚至有可能实现这样的目标吗?

文件和脚本在同一台服务器上。

【问题讨论】:

    标签: php .htaccess access-control


    【解决方案1】:

    是的,您可以通过.htaccess 使用:

    order deny,allow
    deny from all
    allow from example.com/download.php
    

    这将拒绝所有人访问,除非他们通过 example.com/download.php 访问。

    如果您使用的是 Apache 2.4,那么您需要使用:

    Require all denied
    Require host example.com/download.php
    

    显然,您还需要将.htaccess 文件放入您希望限制访问的文件夹中。因此,如果我正确理解您的文件结构,那将是 /clientid/

    【讨论】:

      【解决方案2】:

      我能想到的最简单的方法是使用在 /clientid 文件夹内的文件上生成的唯一会话变量 - 无论这些文件扩展名是什么,它们都是简单的 PHP 页面,已加载通过download.php文件。

      session_start();
      $_SESSION['file_id'] = $secret_file_id;
      header("Location: http://example.com/download.php?clientid=28692692846");
      

      然后在 download.php 文件中,检查这个变量。

      session_start();
      if((isset($_SESSION['file_id'])) && ($_SESSION['file_id'] == $secret_file_id)) {
          // Offer file for download
      } else {
          //Not referred from correct URL, reject.
      }
      

      【讨论】:

        【解决方案3】:

        您可以将.htaccess 文件放在该文件夹中,其中仅包含:

        deny from all
        

        这样你不能打开该文件夹中的任何文件,但你可以毫无问题地将它们包含在 php 中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-19
          • 2021-05-01
          • 1970-01-01
          • 2021-03-22
          相关资源
          最近更新 更多