【问题标题】:How do I serve a downloadable file online without exposing the physical path?如何在不暴露物理路径的情况下在线提供可下载文件?
【发布时间】:2010-10-26 12:54:40
【问题描述】:

我正在提供要求用户在下载前注册的文档。目前,一旦您注册并登录,文档的链接将显示为:

myurl.com/docs/mypdf.pdf

因此,任何登录的人都可以看到文档的物理路径。隐藏文档的物理路径以使注册用户无法与未注册用户共享直接链接或发布文档的直接链接的最佳做法是什么其他地方?

编辑:我只是在寻找一个与语言无关的想法,所以我选择了一些我最喜欢的语言作为标签。这种情况下的实际实现是 ASP 经典的。我目前正在使用一个下载包装脚本,该脚本在重定向到实际文档 URL 之前确认用户已登录。为了简单起见,我只是没有将它包含在我的问题中。

【问题讨论】:

    标签: c# php asp-classic


    【解决方案1】:

    很久以前我在经典 ASP 中遇到过类似的问题。

    将文件保存在 webroot 之外的目录中。

    验证后,通过 ADODB.Stream 发送文件,然后检查文件扩展名以确保我设置了正确的 mime 类型。

    【讨论】:

      【解决方案2】:

      您要做的是创建一个 PHP 页面,它会做两件事:

      1. 验证发出请求的用户
      2. 将文件流式传输到客户端

      这个link 将帮助处理流。这段代码可能会有所帮助:

      header("Content-Disposition: attachment; filename=$name of pdf that you want to download");
      header("Content-Type: application/pdf");
      header("Content-Length: ".filesize("$location of pdf/$name of pdf that you want to download"));
      header("Pragma: no-cache");
      header("Expires: 0");
      $fp=fopen("$location of pdf/$name of pdf that you want to download","r");
      print fread($fp,filesize("$location of pdf/$name of pdf that you want to download"));
      fclose($fp);
      exit();
      

      here的讨论中看到这个。

      【讨论】:

      • 第一个标题行有错字:Content-Disposition: attachment;
      【解决方案3】:
      1. 使用脚本进行访问控制

        制作一个类似 myurl.com/file.php?docs/mypdf.pdf 的脚本,用于检查用户是否有权访问该文件。该脚本将从网络不可见的地方获取文件。

      2. (可选)使用 mod_rewrite 使您的 url 看起来不错,并将用户重定向到 file.php 脚本。比如:

        RewriteCond docs/%{REQUEST_FILENAME} !-f

        重写规则 ^(.*)$ file.php/$1 [QSA,L]

        这会将 /docs/mypdf.pdf 重定向到 /file.php?docs/mypdf.pdf 但对用户来说看起来更好。

      【讨论】:

        【解决方案4】:

        不要那样做。而是将文件保存在文档树之外的某个位置,然后使用脚本(例如,php、.Net 等)使它们可访问

        脚本可以检查他们是否已登录,验证他们是否被允许访问该文件,如果是则返回它。他们走的路可能更像这样…… /download.php?file=mypdf.pdf

        类似于...的东西

        <?php
        if (IsUserLoggedIn())
            readfile('/secret/path/to/file/mypdf.pdf');
        ?>
        

        【讨论】:

          【解决方案5】:

          最好的方法是从一个不可通过网络访问的路径读取文件并将其写入输出流。

          这似乎显示了您似乎正在使用的 php 中的一个不错的示例?只需将安全检查添加到 php 顶部,如果它们未经授权,则将其踢出。

          http://www.higherpass.com/php/Tutorials/File-Download-Security/

          【讨论】:

          【解决方案6】:

          您可以在 .net 中使用IHttpHandler,尽管您需要在 IIS 中进行通配符访问。您可以使用基于会话的处理程序。

          【讨论】:

            【解决方案7】:

            不清楚您使用的是 ASP.NET、ASP.NET MVC 还是其他东西。不过这个帖子……

            How can I present a file for download from an MVC controller?

            ...展示了如何使用 ASP.NET 以编程方式将文件返回给用户(问题显示 ASP.NET 方式,答案显示 MVC 方式)。

            这将允许物理文件位于用户无法访问的文件夹中,并允许您在返回文档之前添加验证以确保用户已注册等。

            如果您正处于使用 ASP.NET MVC 为时不晚的开发阶段,那么就这样做吧。这个场景(提供文件)变成了单行,还有很多其他事情会变得更容易(特别是应用程序的测试)。

            【讨论】:

              【解决方案8】:

              最好的方法是使用 php/asp 或服务器端脚本文件来读取文档的外部不可用的位置

              该文件然后可以检查用户是否已登录,它还可以隐藏物理文件的路径

              所以网址是 www.yourwebsite.com/file.php?file=image.png

              file.php 将验证用户是否已登录 然后它会读取文件或将它们重定向到登录页面

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-01-02
                • 2023-03-18
                • 2010-09-14
                • 2019-07-13
                • 2021-03-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多