2017-08-03 161 views
0

我想在文件上傳之前驗證Symfony3上的文件擴展名。到現在爲止,我使用這個代碼(這是一個簡化版本,只是作爲一個片段):在Symfony3上驗證文件擴展名

if ($form->isSubmitted() && $form->isValid()) { 
    $form->handleRequest($request); 
    $file = $form->get('file')->getData(); 
    $ext = $file->guessExtension(); 
    if($ext !== 'myextension'){ 
     die('not allowed'); 
    } 

    $name = md5($file->getClientOriginalName().time()); 
    $full_name = $name.'.'.$ext; 
    $dir = __DIR__.'/../../../web/upload'; 
    $file->move($dir,$full_name); 
} 

的問題是:將文件中的臨時目錄反正上傳?這是安全的嗎?有沒有更好的方法來做到這一點?我最擔心的是有人試圖上傳二進制文件或腳本。謝謝

編輯(感謝加布裏埃爾迪茨):該文件是一個實體的財產。我用assert來聲明它:

/** 
    * @Assert\File(maxSize="20M") 
    */ 
    private $file; 
+0

此文件是實體的屬性嗎? –

+0

對,我用它作爲斷言: /** * @Assert \ File(maxSize =「20M」) */ private $ file; –

+0

文件擴展名只是名稱中的字符串。檢查它並不能幫助用戶上傳幾乎任何類型的文件。如果你想要安全(er),把它放在一個地方,它不能被web服務器執行。這是一個流行的話題,文件上傳有很多問題。 – svgrafov

回答

0

我認爲更好的方法是使用Symfony來保護它。由於該文件是實體的一部分,因此可以使用Assert/File註釋來添加一些約束和安全性。

/** 
* @Assert\File(
*  maxSize = "20M", 
*  mimeTypes = {"application/pdf", "application/x-pdf"}, 
*  mimeTypesMessage = "Please upload a valid PDF" 
* ) 
*/ 
private $file; 

有了這個symfony會處理這在服務器端,並返回一個錯誤給用戶,如果該類型不允許。此外,通過這種方法,您可以確保用戶只能上傳可用類型的文件。

您可以找到現有MIME類型here的列表以及可用symfony的所有約束列表 here

相關問題