代码之家  ›  专栏  ›  技术社区  ›  Hai Tien

是否可以从submit获取实际的链接文件?

  •  1
  • Hai Tien  · 技术社区  · 7 年前

    例如,我使用此表单提交来下载文件。

    if(!isset($hasError) {
      //some code here.
    $file_url = "http://example.com/files/download/file.pdf";
    header("Expires: 0");
                      header("Cache-Control: no-cache, no-store, must-revalidate"); 
                      header('Cache-Control: pre-check=0, post-check=0, max-age=0', false); 
                      header("Pragma: no-cache");   
                      header("Content-type: {$content_type}");
                      header("Content-Disposition:attachment; filename={$file_new_name}");
                      header("Content-Type: application/force-download");
                      flush();
                      readfile("{$file_url}");
                      exit();
    }
    

    使用上面的提交表单,它将返回可下载的文件进行保存。 正如我在chrome上看到的(ctrl+j),下载链接不显示。它只显示与动作的形式链接。 但是,访问者可以知道这样的实际链接:“ http://example.com/files/download/file.pdf “。

    如果他们能找到这种联系,有什么办法可以阻止这种情况?

    非常感谢。

    3 回复  |  直到 7 年前
        1
  •  1
  •   user2226755    7 年前

    您可以添加 .htaccess 具有 Deny from all 在里面 files/download/ 要禁止直接访问(=http请求),但使用read file可以读取文件。


    注意:您需要使用readfile函数并按如下方式传输您的请求(对于大文件): https://www.media-division.com/the-right-way-to-handle-file-downloads-in-php/ 和; https://www.media-division.com/php-download-script-with-resume-option/

        2
  •  1
  •   GrowingBrick    7 年前

    不,从浏览器中找不到源链接,php脚本正在无意中发送输出远程文件内容,这正是 readfile 函数会读取内容缓冲区并将其回送到浏览器,而不会泄漏任何信息。

    浏览器没有办法知道任何东西,用户只能对响应速度做一些计时分析,以知道文件是服务器本地的还是远程的,但不能超过这个(仍然不知道“远程”在哪里)。

        3
  •  1
  •   Álvaro González    7 年前

    这个 manual page for readfile() 说(强调我的):

    返回值

    返回从文件中读取的字节数。如果发生错误, 返回false,除非函数被调用为@readfile(), 打印错误消息 .

    提及 @ 甚至不是特别正确,因为您可以有一个忽略它的自定义错误处理程序。这意味着,根据服务器配置,可以将url作为输出的一部分打印出来。例如,按原样运行代码会在“我的电脑”中打印以下内容:

    Warning: readfile(http://example.com/files/download/file.pdf): failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found in Standard input code on line 13

    这(和类似的问题)可以通过确保错误消息永远不会显示给用户来避免。通常包括设置 display_errors false 在生产环境中,以及在这种情况下,确保正确处理警告(使用 @ 或与 custom error handler )

    在任何情况下,受保护的下载通常使用受密码保护的位置和/或临时链接进行处理。代理服务器并没有隐藏这样一个事实:有一个开放的Internet服务器,可以免费下载文件。


    注: 这个答案是在网络下载被使用的假设下写的,因为它是一个远程资源。使用http获取本地文件相当于在internet上共享桌面,用google chrome打开文件,而不是双击文件管理器。构建受保护的下载系统的正确方法是将文件移动到公共web服务器根目录之外,并提供 readfile() 使用本地文件系统路径,例如:

    readfile('/home/foo/private/file.pdf');
    

    这样,意外暴露本地路径不是安全问题。但是,如前所述,这是另一个问题。

    推荐文章