防止未经授权的用户直接访问上传的文件 - Symfony
Prevent direct access to uploaded files only for unauthorized users - Symfony
出于安全考虑,我正在尝试仅允许在我的网站上登录的用户直接访问上传的文件。我尝试了 this 配置,但它似乎正在处理下载图像。
这是我的 Twig 文件代码,我在其中显示图像。
{% if(req.media!='') %}
<a href="{% path req.media, 'reference' %}"
data-fancybox class="fancybox">
<img src="{% path (req.media), 'reference' %}" alt="" width="70px"
height="70px"/>
</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
我按照这些步骤实现了这个要求。
- 创建了一个函数并将其路由添加到防火墙中,因此匿名用户无法访问该路径。
- 创建了一个路由来设置它的路径。
- 在函数中获取了媒体 ID,并对 return 文件执行了功能。
- 通过参数
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 }}
出于安全考虑,我正在尝试仅允许在我的网站上登录的用户直接访问上传的文件。我尝试了 this 配置,但它似乎正在处理下载图像。
这是我的 Twig 文件代码,我在其中显示图像。
{% if(req.media!='') %}
<a href="{% path req.media, 'reference' %}"
data-fancybox class="fancybox">
<img src="{% path (req.media), 'reference' %}" alt="" width="70px"
height="70px"/>
</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
我按照这些步骤实现了这个要求。
- 创建了一个函数并将其路由添加到防火墙中,因此匿名用户无法访问该路径。
- 创建了一个路由来设置它的路径。
- 在函数中获取了媒体 ID,并对 return 文件执行了功能。
- 通过参数
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 }}