允许用户在webroot之外下载文件

时间:2010-10-07 18:28:17

标签: php download

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

由于他们不在webroot中,我无法下载,因为他们会有一个网址

  

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服务器。所以应该没有访问问题。

3 个答案:

答案 0 :(得分:9)

使用

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

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

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

后者是最不可取的选择,因为它是资源密集型的,但有时它是唯一的选择。它还需要适当的安全措施,以防止攻击者通过代理服务器获取服务器上的其他文件。

答案 1 :(得分:1)

你可以,只需要一个php文件,将文件中的内容回应给响应,并适当地设置mime类型。

答案 2 :(得分:0)

如果你可以安装PHP,那么加载PHP的好方法就是使用mod_xsendfile,所有PHP进程必须做的就是发送一个回复标题&amp;退出,网络服务器将负责其余部分。