如何在不暴露物理路径的情况下在线提供可下载文件?

时间:2009-05-15 15:13:58

标签: c# php asp-classic

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

myurl.com/docs/mypdf.pdf

因此,文档的物理路径会向登录的任何人公开。保持文档的物理路径隐藏的最佳做法是什么,以便注册用户无法与未注册用户共享直接链接或发布文档的直接链接别处?

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

8 个答案:

答案 0 :(得分:11)

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

脚本可以检查他们是否已登录,验证是否允许他们使用该文件,如果是,则返回该文件。他们走的路可能看起来更像...... /download.php?file=mypdf.pdf

有些事情......

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

答案 1 :(得分:8)

最好的方法是从非Web可访问路径读取文件并将其写入输出流。

这似乎在你似乎使用的php中显示了一个好的例子?只需在php的顶部添加安全检查,如果未经授权,请将其删除。

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

答案 2 :(得分:1)

最好的方法是使用php / asp或serverside脚本文件,将文档读取到外面不可用的位置

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

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

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

答案 3 :(得分:1)

您要做的是创建一个PHP页面,它可以完成两件事:

  1. 对发出请求的用户进行身份验证
  2. 将文件流式传输到客户端
  3. 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中看到了这一点。

答案 4 :(得分:1)

我在经典ASP中遇到过类似的问题。

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

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

答案 5 :(得分:0)

目前尚不清楚您是使用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还为时不晚。这种情况(提供文件)变成了一个单行,而且许多其他事情将变得更容易(特别是对您的应用程序进行测试)。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

  1. 使用脚本进行访问控制

    制作类似myurl.com/file.php?docs/mypdf.pdf的脚本,检查用户是否有权访问该文件。该脚本将从Web不可见的位置获取文件。

  2. (可选)使用mod_rewrite使您的网址看起来不错,并将用户重定向到file.php脚本。类似的东西:

    RewriteCond docs /%{REQUEST_FILENAME}!-f

    RewriteRule ^(。*)$ file.php / $ 1 [QSA,L]

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