在Symfony3

时间:2017-08-03 22:06:22

标签: php symfony symfony-forms symfony-3.1

我想在上传文件之前验证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);
}

问题是:文件是否会上传到临时目录?这样安全吗?有没有更好的方法呢?我最担心的是有人试图上传二进制文件或脚本。感谢

编辑(感谢Gabriel Diez):该文件是实体的属性。我使用assert声明它:

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

1 个答案:

答案 0 :(得分:1)

我认为更好的方法是使用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