2009-09-16 87 views
0

我正在开发一个购物系统,shopmanager应该能够将文件上传到系统。这些文件可以付费出售,只能通过提供购买代码才能访问。将文件上传到webroot之外

整个购买代码和上传的东西工作正常。只需阻止对文件的直接访问。

问题:

  • 我怎样才能让用户根目录以外的上传而不是从那里读/下载?
  • 或者我如何让用户上传到一个目录,但没有人可以从中读取/下载?

我运行Apache和使用这样的代码通过表格来上传文件:

public function upload_file($file='',$post_value='',$path) { 
    if ($_FILES[$post_value]) { 
     $uploadext = strtolower(strrchr($_FILES[$post_value]['name'],".")); 
     if($uploadext=='.jpg' || $uploadext=='.gif' || $uploadext=='.png' || $uploadext=='.swf' || $uploadext=='.jpeg' || $uploadext=='.pdf' || $uploadext=='.doc' || $uploadext=='.xls' || $uploadext=='.docx') { 
    $destination = $path.$file.$uploadext; 
     move_uploaded_file($_FILES[$post_value]['tmp_name'], $destination); 
    } else { 
    echo PICTURE_ERROR; 
    } 
    } 
    return $file.$uploadext; 
} 

回答

4

你可以上传任何你想使用move_uploaded_file函数,只要确保Web服务器可以写目的地目录。

必须创建一个脚本来读取文件并将其传递给浏览器,以便确保用户已付款。

为例

<?php 
// insert your logic here to verify the user has access to this file. 
// open the file in a binary mode 
$name = 'yourfile'; 

$fp = fopen($name, 'rb'); 

// send the right headers 
header("Content-Type: image/png"); 
header("Content-Length: " . filesize($name)); 

// dump the picture and stop the script 
fpassthru($fp); 
exit; 

?> 

你必须要小心的内容类型也确保用户不能在您的服务器的每一个文件,如果您使用$ _GET变量用于获取文件名。

+0

这是最接近的答案。我创建了一个权限为333的目录,并使用如下所示的.htaccess重定向:example.com/download/shhsfgoagoaag/1/指向一个php文件,该文件在下载后将所有内容解析为参数。此外,提供的文件还有另一个名称,即原始名称。所以黑客必须知道确切的:原始文件名和目录(读取权限在目录上关闭)。店铺经理仍然可以上传文件没有问题。由于基数限制,在webroot之外是不可能的。 – Cudos 2009-09-17 10:34:45

0

这其实很简单。只需为您的文件创建一个目录并给予apache写入权限。然后,当您拨打move_uploaded_file()函数时,您可以指定该目录的目的地。 PHP运行服务器端,因此它将能够访问该目录,而使用浏览器的用户将仅限于Apache允许他们访问的内容。

如果您需要下载这些文件,只需创建一个脚本来解析URL参数(或其他),然后从文件目录中取出文件并将其推送到浏览器。

0

使用.htaccess文件或在apache.conf中配置为不允许直接访问上传目录。

<Directory /path/to/upload/dir> 
    Order Deny,Allow 
    Deny from All 
</Directory> 
0

从保护文件的角度来看,将文件保存到webroot之外可能是最简单的。当有人想要下载文件时,您可以使用http_send_file将文件发回给他们。

相关问题