【问题标题】:Symfony2 Firewall: protect /web folderSymfony2 防火墙:保护 /web 文件夹
【发布时间】:2015-06-16 13:48:23
【问题描述】:

我正在开发一个完全位于防火墙后面的 SF2 网络应用程序:在登录之前,任何人都不能看到或修改任何内容(当然,登录表单除外)。

这是我的security.yml 文件中的firewall 部分:

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main_login:
        pattern:   ^/login$
        anonymous: true
    main:
        pattern:        ^/
        anonymous:      false
        form_login:
            login_path: fos_user_security_login
            check_path: fos_user_security_check
        logout:
            path:       fos_user_security_logout
            target:     /

这很好用:如果我在未登录的情况下键入 url http://mywebsite.com/app.php/article/show/1,我会被转发到登录页面。

我的问题是我有一些文档和媒体文件位于 Symfony 的 web 目录中(例如 myapp/web/document/myTextFile.txt)。登录用户可以通过我的应用访问它们,非登录用户也可以访问它们!

任何输入http://mywebsite.com/app.php/document/myTextFile.txt 的人都可以下载该文件...

为什么pattern: ^/ 行不阻止这种情况? web文件夹是否默认排除,因为它包含app.phpjs/css/文件夹?

如何保护我的文件?


更新:显示受保护的图像

我尝试了 Gerry 建议的解决方案,它可以很好地保护我的文档的下载。

不过,我的document 文件夹中也有图片,我想显示这些图片,直接包含在相关页面中。

比如http://mywebsite.com/app.php/article/show/1里面会有文字和图片myapp/app/Resources/document/AAA.jpghttp://mywebsite.com/app.php/article/show/2里面会有文字和图片myapp/app/Resources/document/BBB.jpg

我尝试使用 Assetic 进行此操作,但似乎是针对“静态”图像(如顶部徽标或不依赖对象的图像)完成的。

我看到的一个解决方案是将图像转换为 Base64 并像这样包含它:<img alt="" src="data:image/png;base64(...)" />,但看起来真的很难看...

【问题讨论】:

  • 我认为这个 Stackoverflow 主题可能会对您有所帮助 [stackoverflow.com/questions/12148272/… [1]: stackoverflow.com/questions/12148272/…
  • 为什么不直接将图片上传到src/My/MyBundle/Resources/public
  • 我应该在我的图片的src (<img src="?????" />) 中添加什么内容?因为如果我输入<img src="{{ asset('../app/Resources/documents/'~document.fileName)}}"/> 然后app/console assetic:dumpapp/console assets:installapp/Resources/documents 文件夹的内容将被复制(或符号链接)回web/

标签: php symfony fosuserbundle


【解决方案1】:

web 目录是您的公共根目录,由 web 服务器 (Apache/Nginx/...) 提供服务。

默认情况下,对现有文件的任何请求根本不会通过 Symfony,因此没有防火墙设置会阻止访问驻留在 Web 根目录中的文件。

干净的解决方案是将这些文件移动到 webroot 之外的另一个目录,例如 app/Resources/uploads。然后你可以编写一个 Symfony 控制器来下载这些文件。

【讨论】:

  • 谢谢。请查看我的编辑:我详细说明了我的一些需求。
  • 它对任何类型的文件(包括图像)的工作方式完全相同。只需确保在从控制器提供它们时设置正确的 Content-Type 标头即可。
  • 下载它们,好的,我试过了,它适用于图像以及任何其他文档。但是如何将它们显示在 inside 页面中?
  • 在 HTML 中显示图像本质上是要求浏览器下载并呈现它们......在服务端没有区别。只需使用 URL 作为图片的 src 属性即可。
  • 哼!我尝试了很多东西,但不是那样。对我来说,src 属性需要一个像http://server.com/folder/image.jpg 这样的 URL,并且当我的控制器给出“响应”时,我认为它不会匹配。无论如何,感谢您提供的解决方案,它与我预期的一样干净。
【解决方案2】:

我现在没有安装 Symfony 的工作,但是尝试从网络上移动你的文档,如果防火墙会继续。

请告诉我答案,如果它不起作用,或者您将无法在生产中移动这些文件,我们会尝试找出解决方案。

【讨论】:

  • 我应该把它们移到哪里?在app/?如果它们在这里,我如何访问它们?仅供参考,我使用the method described here 上传我的文件
  • 哦,我忘记了 Symfony 的结构。
  • 嗯,还不确定任何解决方案,也许是 htaccess?
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多