2012-12-23 48 views
1
$f = $_GET['f']; 
//f = filename i.e file.mp3 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($f)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($f)); 
ob_clean(); 
flush(); 

此代碼的工作,如果我都保存在根目錄中的MP3文件,但如果我把它們存儲在一個單獨的文件夾,如/文件基名對於迪爾

我曾試圖改變它不確實基地名稱和添加路徑到$f,但沒有運氣

有沒有辦法我可以有這樣的代碼從dir而不是根下載文件?

+5

這不僅僅是一個安全問題,它是對你的服務器的邀請... – KingCrunch

+2

我沒有看到你實際上在任何地方輸出文件... –

+0

我忘了添加readfile()它在那裏雖然 –

回答

1

那麼這將是因爲basename明確除了文件路徑的文件名部分除外。所以basename("foo/bar/baz.mp3")產生「baz.mp3」。

正如其他人已經提到你編寫你的PHP腳本的方式是一個主要的安全缺陷,因爲現在有人可以做一些像「www.example.com/index.php?f=index.php」和你的腳本(假設它位於www.example.com/index.php)將提供自己的源代碼。有了一點創意,腳本可以訪問的任何外部文件都可以用這種方式下載。不好,你真的需要限制文件到允許的路徑白名單

+0

我已經創建了一個名爲文件的文件夾,所以我可以限制只從那裏下載? –

+3

@BrendanMullan在使用它之前,您必須驗證'$ _GET ['f']'。你如何去做取決於你。 – KingCrunch