【问题标题】:Security in file upload with Symfony2: where to safely store them?使用 Symfony2 上传文件的安全性:在哪里安全地存储它们?
【发布时间】:2012-11-07 12:29:55
【问题描述】:

我使用 Ajax 应用程序在 Symfony2 网络应用程序中上传文件。 当我上传文件时,我将它们放在如下路径中:

"%kernel.root_dir%/../web/bundles/acmehome/images/uploaded"

我在管理这些文件方面遇到了很多麻烦。

web 目录中的所有文件都可见/可搜索/可浏览吗? 如果是,我应该使用哪个路径进行存储以使它们仅对注册用户可见?

我提出这个问题是因为here 用户 Rook 建议不要将文件存储在 web 根目录中。

【问题讨论】:

    标签: file-upload symfony security


    【解决方案1】:

    是的,在默认配置中,所有文件都是可见/可搜索/可浏览的。您可以通过目录中的 .htaccess 文件限制访问。

    我认为这是将上传的文件移动到非 Web 根文件夹中的好方法。

    这个话题让我很感兴趣。

    【讨论】:

    • 上传的文件应该移到哪里?
    【解决方案2】:

    我所做的是为每次上传创建一个数据库条目

    1 - 我将文件上传到 web/upload/[month]/[day] 等文件夹(我使用 .htaccess 保护上传文件夹)

    2 - (我创建了一个名为上传的学说实体)在上传期间我创建了一个条目 姓名, 描述, 文件路径, 文件扩展名, 所有者类型(我上传文件的实体), owner id(实体id)

    3 - 最后,如果我将我的文件上传到“博客实体”(vendor\entity\Blog) 或评论实体 (vendor\entity\Comment),我将请求所有属于的文件。

    $em = $this->getDoctrine()->getEntityManager();
            $documents = $em->getRepository('VendorBundle:Upload')->findBy(array(
            'ownerType' =>$entityName,
            'ownerId'   =>$id
        ));
    

    这种方法非常灵活,允许您创建一个可以上传到各种实体的上传模块。 此外,由于上传被索引,通过搜索引擎的搜索效率更高(因为您可以添加描述、名称等元数据...)

    【讨论】:

    • 好吧,我的问题更多与“存储文件的位置”有关,而不是“使用哪个模型存储它们”。关于定义子目录,不知道有没有这样的优势。阅读that Q/A
    • 上传文件的真正问题是向用户显示它在服务器上的存储位置,因为如果它是一个脚本,他们必须从 url 调用它来执行它。
    • 但我不会把它放在 web/bundles 中,因为它通常是我们存储东西的地方(根据文档)。我更喜欢 web/upload/random()
    • 我为什么要定义一个随机名称dir?我可以为文件设置一个随机名称...此外,如果我想拒绝对目录的访问,我认为 .htaccess 应该可以工作。
    • 我知道!但我们是一家从事数据检索的公司。如果文件名带有前缀模式,则很容易通过名称获取文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2018-07-19
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多