2009-09-16 61 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將文件發回給他們。