防止未经授权的用户直接访问上传的文件 - Symfony

Posted

技术标签:

【中文标题】防止未经授权的用户直接访问上传的文件 - Symfony【英文标题】:Prevent direct access to uploaded files only for unauthorized users - Symfony 【发布时间】:2019-05-28 08:02:34 【问题描述】:

出于安全考虑,我正在尝试仅为我网站中的登录用户提供对上传文件的直接访问权限。我尝试了this 配置,但它似乎正在下载图像。

这是我在其中显示图像的 Twig 文件代码

% if(req.media!='') %
      <a href="% path req.media, 'reference' %"
      data-fancybox class="fancybox">
       <img src="% path (req.media), 'reference' %"  
        />
      </a>
% endif %

下面的奏鸣曲媒体配置。

Sonata_media.yml

sonata_media:
# if you don't use default namespace configuration
#class:
#    media: MyVendor\MediaBundle\Entity\Media
#    gallery: MyVendor\MediaBundle\Entity\Gallery
#    gallery_has_media: MyVendor\MediaBundle\Entity\GalleryHasMedia
db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr it is mandatory to choose one here
default_context: default # you need to set a context
contexts:
    default:  # the default context is mandatory
        download:
            strategy: sonata.media.security.forbidden_strategy
        providers:
            #- sonata.media.provider.dailymotion
            #- sonata.media.provider.youtube
            - sonata.media.provider.image
            - sonata.media.provider.file
            #- sonata.media.provider.vimeo

【问题讨论】:

你能放一些代码快照吗?或者解释一下你是如何做出图像响应的 @akbansa 添加了与媒体相关的代码。如果您需要更多解释,请告诉我。 【参考方案1】:

我按照这些步骤来实现这个要求。

    创建了一个函数并在防火墙中添加了它的路由,因此匿名用户无法进入该路径。 创建了一个路由来设置它的路径。 在函数中获取了媒体 ID,并执行了返回文件的功能。 通过带有参数mediaId 的路径调用函数,而不是在twig 中调用直接媒体。

这是代码。

security.yml

-  path: ^/user(.*), roles: ROLE_DASHBOARD_USER 

routing.yml

cms_direct_access_uploaded_files:
path:     /user/image-return/fileId
defaults:  _controller: CMSFrontUserBundle:Dashboard:DirectAccessUploadedMedia 

控制器

    public function DirectAccessUploadedMediaAction(Request $request,$fileId = null)
    $user = $this->getUser();
    if(!empty($user))
        $DM = $this->getDoctrineManager();
        $media = $DM->getRepository('ApplicationSonataMediaBundle:Media')->find($fileId);
        if(!empty($media)) 
            $provider   = $this->container->get( $media->getProviderName() );
            $format     = $provider->getFormatName( $media, 'reference' );
            $url        = $provider->generatePublicUrl( $media, $format );
            $ext = pathinfo($url, PATHINFO_EXTENSION);
            $returnFile = $_SERVER['DOCUMENT_ROOT'] .'/web'. $url;
            if (file_exists($returnFile)) 
                if($ext == 'pdf')
                    header("Content-Type: application/pdf");
                else
                    header("Content-Type: image/jpeg");
                
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . filesize($returnFile));
                readfile($returnFile);
                exit;
            
        else
            throw $this->createAccessDeniedException('Forbidden!');
        
    else
        throw $this->createAccessDeniedException('Forbidden!');
    

树枝

 url('homepage') user/image-return/ req.media.id 

【讨论】:

以上是关于防止未经授权的用户直接访问上传的文件 - Symfony的主要内容,如果未能解决你的问题,请参考以下文章

如何防止未经授权访问我的 Firebase 实时数据库?

SQLSERVER使用密码加密备份文件以防止未经授权还原数据库

利用session防止用户未经登录而直接访问

从角度访问webapi时出现401未经授权的错误

Django Rest Framework 和 React 前端:如何防止未经授权的用户在获得图像 URL 的情况下查看私人图像?

web 安全 初探 (正在更新)