php - 在 Symfony3 上验证文件扩展名

标签 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\File(maxSize="20M")
     */
    private $file;

最佳答案

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

关于php - 在 Symfony3 上验证文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495285/

相关文章:

php - 如何配置 Nginx 以将特定请求模式路由到托管 Symfony 应用程序的特定 php-fpm 上游?

javascript - PHP 或 JavaScript/jQuery 中的 Future timeago 方法

javascript - Symfony2 + Doctrine + FormType,关系和动态添加行

php - 在 Symfony 3.3 中使用 DI 在抽象类中 Autowiring ,这可能吗?

php - Symfony2 在表单提交/验证后设置实体属性

symfony - 奏鸣曲 : Fatal error: Maximum function nesting level of '100' reached.。嵌入表格时

php - 操作方法 : Optimize Symfony's forms' performance?

javascript - 在第一个文本框中输入时,在第二个文本框中获取 mysql 数据

php - 如何在两份工作之间延迟?

javascript - JQuery - 使用 Flot Charts 从 php 绘制时间序列数据