2013-02-06 113 views
0

我有以下代碼,我使用它來強制下載文件而不是在瀏覽器中打開。動態設置內容類型

if(isset($_POST['file_name'])){ 
$player_file = $_POST['file_name']; 
$accessKey = "REMOVED"; 
$secretKey = "REMOVED"; 
$bucket = $_POST['bucket']; 
$fname = $_POST['fname']; 

$zip_url = el_s3_getTemporaryZipLink($accessKey, $secretKey, $bucket, $fname); 
$mp3_url = el_s3_getTemporaryMP3Link($accessKey, $secretKey, $bucket, $fname);  


header('Content-type: audio/mpeg3'); 
header('Content-Disposition: attachment; filename="themixtapesite_'.$player_file.'"'); 
readfile($mp3_url); 
exit(); 
} 

正如你所看到的,我通過了一個窗體中的所有變量。然後使用該信息爲存儲在Amazon S3上的文件生成唯一的Signed URL。

如果文件是MP3,我需要它使用$ mp3_url,如果它是一個Zip文件,我需要使用$ zip_url。

這一定很簡單,但我一直坐在這個屏幕前面整天現在我已經有了一個完整的頭腦空白!

任何幫助表示讚賞。

+0

創建一個數組控件擴展。檢查請求文件的擴展名並據此設置內容類型。 – SachinGutte

+0

依靠擴展內容類型檢查是一個壞習慣... – BenM

回答

2
  1. 此代碼是一個巨大的安全漏洞。任何願意使用它的人都可以打開服務器的大門。
  2. 使用array of mime types來確定一個擴展的MIME類型(儘管如此,你需要額外的安全檢查,因爲僅僅依靠擴展進行中繼並不是一件聰明的事情)。
  3. 使用switch語句來確定使用哪個函數。切換後,你應該有$url - 只有一個變量存儲擴展名,而不是兩個不同的變量。
+0

感謝回覆@MarcinWolny。你能否詳細說明它的安全性?只是爲了澄清使用POST形式提交的信息不是用戶輸入。它是隱藏的字段,由來自另一頁面的變量填充。 –

+2

@BarryJarvis有沒有這樣的事情,「通過不是用戶input_的POST使用表單提交_information」。這是導致網站被黑客入侵的最常見錯誤之一。雖然我不稱它爲黑客攻擊:它是訪問不安全的系統。 **通過POST或GET發送的任何數據都可以通過任何具有一點網站管理經驗的人輕易修改**。您的安全缺陷是您認爲POST數據甚至是遠程安全或可預測的。不是。 – MarcinWolny

+0

我使用的表單是下載文件,我使用表單的原因是爲了將直接url隱藏到文件中。我用帶有必要信息的變量填充表單。有沒有更好的方法來強制下載文件,而不是通過表單傳遞信息並設置標題?我對PHP很陌生,所以我可能會犯這本書中的所有錯誤! * P.S。我更新的代碼,以反映變化我它使...通過我的訪問密鑰通過形式肯定是不明智之舉!* –