【问题标题】:Why access control does not work when trying to access an image directly?为什么尝试直接访问图像时访问控制不起作用?
【发布时间】:2013-10-28 23:15:39
【问题描述】:

我在security.yml 文件中有下一个:

access_control:

- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
- { path: ^/forum/, role: ROLE_USER }
- { path: /usuarios/, role: ROLE_NO_ACCESS }

但如果我尝试访问/public/img/usuarios/otherDirectory/ 中的文件并将其放入导航栏,则图像会显示在浏览器中。

为什么不拒绝访问?

更新

我已尝试将此添加到 Apache 站点配置(在我的本地主机中):

    <Directory /home/me/MyServer/itransformer-2.0/web/public/img/usuarios>
                    AllowOverride none
                    Options -Indexes
                    Order allow,deny
                    Deny from all
    </Directory>

但我仍然可以直接访问图像。也许我做错了什么......

【问题讨论】:

  • 我不熟悉这个 .yml 结构,但似乎你只是阻止了 /usuarios/ 路径尝试使用像 /usuarios/**/usuarios/* 这样的通配符
  • 你的重写规则是什么?通常,如果文件存在,则直接由 Web 服务器提供,而不是由 PHP 处理。
  • @JorgeCampos:对不起,你错了,语法是正确的(见documentation)。
  • @n.1 - 我喜欢你的选择,但尝试没有成功:stackoverflow.com/questions/19656103/…
  • @n.1 - 完成。看看上面的链接。

标签: php apache security symfony yaml


【解决方案1】:

您的文件在public 文件夹中,所以它是public,换句话说,这不是存储私人文件的正确位置。

根据this post(或this one on Stack Overflow),您可以从控制器提供文件。所以尝试在受保护的 URL 后面使用这个控制器。

要提供多个文件,您必须将文件的路径存储在数据库中。例如:

+----+------------+
| id |    path    |
+----+------------+
|  1 | image.jpg  |
|  2 | image2.jpg |
+----+------------+

文件的管理在Symfony2 cookbook中解释。

【讨论】:

  • 我已经询问过避免直接访问图像的问题,但我正在处理您在答案中所说的所有内容。问题只是在知道路径时避免直接访问(理论上你不会知道除了你自己的路径)。还是谢谢你。
  • 如果没有人知道路径,为什么要尽量避免直接访问?访问者可以猜到文件的路径吗?例如在短时间内尝试所有字母组合?
  • 因为路径和文件的名称基于会话 ID。这就是我的恐惧。
  • 为什么使用会话ID?您可以使用完全随机的哈希作为标识符。
  • 因为我每 30 分钟使用 crontab 作业自动删除文件,所以我必须知道当前用户和他们保护文件的目录以不删除它们。
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2021-02-20
  • 2016-01-03
  • 2012-02-01
  • 2014-01-05
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多