【问题标题】:How do I use HTML5 to download from a non web folder?如何使用 HTML5 从非 Web 文件夹下载?
【发布时间】:2016-09-06 23:27:04
【问题描述】:

我有一个网页仅供内部使用。它将托管在主要运行其他进程的服务器上,这些进程在 /opt/appname/logs/ 目录中生成日志文件。我的任务是制作一个 Web 界面,允许将这些日志文件下载到我们网络上的任何计算机上。我在 Debian 上使用 Apache。这是我目前所拥有的:

<details>
   <summary><b>Download Log Files</b></summary>
   <?php
   foreach (glob("/opt/appname/logs/*.log") as $filename) {
      $file_info = explode("/logs/", $filename);
      ?>
      <a href="<?php echo $filename ?>" download><?php echo $file_info[1] ?></a>
      <br>
   <?php } ?>
</details>

当我尝试下载日志文件时,下载看起来像是开始了,但随后给了我“没有文件失败”的消息。我在网上发现很多帖子说你可以或不能这样做,但没有一个提供足够的例子。我意识到访问 Web 文件夹之外的任何内容都存在问题,但必须有某种方法可以做到这一点。我在这里真的很茫然,所以任何建议都会很棒。最后,我是自学成才的,所以如果您发现任何错误或我没有做最佳实践的事情,请告诉我。我一直在努力改进。

【问题讨论】:

  • 这里稍微澄清一下。我不确定该链接如何帮助我。单击链接时,我已准备好下载,这是安全文件夹权限和/或路径的问题。与使用 php 重新创建相比,使用内置 html5 功能不是更好吗?

标签: php linux html apache


【解决方案1】:

这是一个与安全相关的事情,浏览器只能访问服务器上某些路径中的文件,因此不应该有一个“简单”的解决方案。

可以做什么:

  1. 在您的 Web 服务器配置中定义路径或文件的别名

  1. 编写一个被调用的小程序,它从所需位置读取文件并将其作为输出发送。

在后一种情况下,您应该记住,通过参数提供路径就像为所有喜欢阅读您服务器上的所有文件的人打开了一扇门!

【讨论】:

  • 关于后一种情况(2.):“通过参数给定路径”是什么意思?
  • 在您的情况下,您只使用文件名,而不是路径。这可能没问题,因此只有某个文件夹中的文件可用。如果您改为使用完整路径作为参数,那将是一个问题。只是想警告你;-)
  • 仅供参考:我不是写开篇文章的人。
  • @Jachim Schirrmacher 这基本上是我改变的。我只从主页传递文件名,在 download.php 中我有硬编码的路径。我意识到仍然有办法解决这个问题,但这是一个比以前更安全的世界。我将来会添加更多。为有用的信息 +1。
【解决方案2】:

您可以创建一个文件download.php。该文件可能类似于:

下载.php

$fn = $_GET["filename"];

if (is_readable($fn)) {
    header('Content-Description: File Transfer');
    header('Content-Type: text/plain');
    header('Content-Disposition: attachment; filename="'.$fn.'"');        
    readfile($fn);
} else {
   //return a 404 error perhaps.
}

然后您可以将原始列表代码修改为:

<details>
   <summary><b>Download Log Files</b></summary>
   <?php
   foreach (glob("/opt/appname/logs/*.log") as $filename) {
      $file_info = explode("/logs/", $filename);
      ?>
      <a href="download.php?filename=<?php echo $filename ?>" download><?php echo $file_info[1] ?></a>
      <br>
   <?php } ?>
</details>

我个人喜欢这种方法,因为您还可以在“下载管理器”中添加额外的检查和异常。

【讨论】:

  • 这就是我所说的安全漏洞的意思...您可以轻松调用download.php?filename=/etc/passwd 或类似名称以允许读取服务器上的任何文件。
  • @JoachimSchirrmacher 这只是一个例子。对于人们在现实世界中实际使用的东西,显然需要添加许多安全检查。
  • 虽然我理解与当前情况有关的安全问题,但它非常适合。我永远不会将它部署到面向网页的页面中,但我在这里所拥有的只是一个小型内部员工,如果他们真的想要的话,他们无论如何都可以访问服务器。我现在正在下载文件,但是当我打开它时它是空的。有什么想法吗?
  • 知道了。我改为 readfile($file_name);而不是 fopen 和 fpassthru 就可以了。非常感谢你们的帮助。我会努力解决这个安全问题。
猜你喜欢
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多