【问题标题】:Allow users to download files outside webroot允许用户在 webroot 之外下载文件
【发布时间】:2010-10-07 18:28:16
【问题描述】:

您好,我正在使用 PHP 来允许用户上传文件,出于安全原因,我将它们放在 webroot (/var/www) 文件夹之外的文件夹中。它位于文件夹 /var/uploads 中。用户上传特定记录的文件。一旦上传的文件被移动到上传文件夹,附件的地址就会存储在数据库中。现在,每当用户检查记录时,都会显示特定记录的附件以供下载。

由于它们不在 webroot 中,我无法下载它们,因为它们的 url 为

http://localhost/var/uploads/attachment.txt

我们是否有解决方案,或者它应该是可下载文件夹是 webroot 的子目录吗?

<?php
$con = mysql_connect("localhost","id","pass");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$result = mysql_query("select * from attachments");

while($row = mysql_fetch_array($result))
{
echo '<a href="'.$row[2].'" target="_blank">Download</a>--'.$row[3].'<br>';
}

mysql_close($con);
?> 

是我正在使用的代码。该文件夹的所有者是 www-data:/ 或 Web 服务器。所以应该没有访问问题。

【问题讨论】:

  • “现在每当用户检查记录时,将显示特定记录的附件以供下载” - 这不会破坏您对安全性的需求吗?

标签: php download


【解决方案1】:

使用

  • 一个symlink指向/var/uploads(教程here

  • 一个 Apache Alias directive Alias /uploads /var/uploads(必须在 httpd.conf 中)

  • 或接受 GET 变量 filename=upload.jpg 并获取文件的代理 PHP 脚本,例如使用fpassthru()

后者是最不受欢迎的选择,因为它占用大量资源,但有时它是唯一的选择。它还需要适当的保护,以防止攻击者通过代理获取您服务器上的其他文件。

【讨论】:

  • 什么是符号链接??我是上传和下载的新手!别介意
  • @sai 你可以访问你的服务器吗?根访问权限?
  • 尽管有系统开销,但后者确实具有明显的优势。将所有内容保留在脚本中可以让您获得更多控制权,这样您就可以在发送内容之前对其进行编辑,或者在发送文件之前验证用户凭据。
  • @是的,我确实拥有服务器的 root 访问权限。
  • 另外,为什么我必须为上传设置别名?
【解决方案2】:

你可以,只需要一个 php 文件,将文件内容回显到响应中,并适当地设置 mime-type。

【讨论】:

    【解决方案3】:

    加载 PHP 的一个好方法是使用 mod_xsendfile,如果您可以安装它,PHP 进程所要做的就是发送回复标头并退出,其余的由网络服务器处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2020-06-04
      • 2010-10-15
      • 2014-02-26
      • 2019-04-06
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多