2017-08-03 104 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