2014-03-12 45 views
1

下載當我在下面的文件路徑鍵入文件下載通過地址欄PHP

http://localhost/BookStore/download.php?file=books/feedback.pdf 

我不希望這種情況發生,用戶應該只能夠購買發生之後要下載的文件,如果他們使用這種方法,那麼他們就會得到這個文件。

下面是代碼爲我的download.php文件

<?php 
function downloadFile($file,$speed=1024){ 
if (file_exists($file)) { 
    if(is_dir($file)){return 'isdir';} 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Connection: Keep-Alive'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: '.sprintf("%u", filesize($file))); 

    ob_clean(); 
    $handle = fopen($file, "rb"); 
    $chunksize=(sprintf("%u", filesize($file))/$speed); 

    set_time_limit(0); 
    while (!feof($handle)) { 
     echo fgets($handle, $chunksize); 
     flush(); 
    } 
    fclose($handle); 
    die; 
}else{return false;} 
return; 
} 

    if (isset($_GET['file'])) { 
     $file = $_GET['file']; 
    } 

    $result = downloadFile($file); 

    if ($result == FALSE) { 
     echo "Sorry, file does not exist."; 
    } 

?> 

有沒有可以用來解決這個問題的任何類型的驗證?

由於

+0

爲什麼購買前有文件?或者它是他們正在購買的文件?如果他們購買了它,你應該添加一張支票。 – putvande

+0

這是他們正在購買的文件,此下載鏈接僅在購買發生後纔會出現在他們的帳戶中,但是如果您輸入頂部的地址,它將繞過系統的整個購買方面。 – user3296793

+2

您需要執行身份驗證和授權。您應該至少已經在其他頁面中實現了其中的一部分(否則您將無法運行購物籃)。 – Quentin

回答

1

當他們購買書籍設置會話變量如

$_SESSION[$book] = true; 

或書籍的陣列(用於多發性購買)

$_SESSION['books] = $books; 

,然後在引用此檢查您的功能

if (file_exists($file) && isset($_SESSION[$file])) { // for a single book 

if (isset($_SESSION['books']) && file_exists($file) && isset($_SESSION['books'][$file])) { // for an array of books 

這是未經驗證的,但應該給你一個良好的開端。

+0

我會給這個鏡頭,謝謝! – user3296793

+0

我有一個更完整的答案,但它被擱置....如果你想要另一個例子,你總是可以給我留言。我有一個wordpress插件插件,所以我不得不面對同樣的情況。 – Christophe

+0

你能向我展示你的Christophe例子嗎?謝謝 – user3296793