1

我在Symfony2 (2.2)上遇到了ESI的安全问题:

例如,我的应用程序的某些 ESI 不需要登录并且是公开的,但其他 ESI 要求用户登录并具有角色 ROLE_USER。

问题是每个人都可以通过在导航器的地址栏中写入其 URL 来显示 ESI……所以一个人可以访问 ESI(在需要管理员角色的操作中调用),甚至没有记录!

例如,我的 ESI "SybioWebsiteBundle:Controller:showEsiAction" 可以在以下 URL 读取: http ://mywebsiteurl.com/_proxy?_path=id%3D1%26slug%3Dlorem%26locale%3Dfr%26ranks%3D1-2-3 -5-6-7%26page%3D1%26isPhotograph%3D1%26_format%3Dhtml%26_controller%3DSybioWebsiteBundle%253AAlbum%253AshowEsi

这个 ESI 应该只有登录的用户才能看到:他们去 showAction,在 Twig 模板中,这个 ESI 被称为......但是由于这个“问题”,所有人都可以作弊和阅读!

我搜索了解决方案,我得到了一个非常丑陋的解决方案:检查用户是否已登录 ESI 操作……没关系,但我正在使用HTTP 缓存验证来优化我的站点加载(和内存)。所以如果我选择这个解决方案,我需要添加一个额外的 ETag 来测试用户角色,以在每次无用户访问 ESI 时清除 ESI 缓存,并显示一个空响应,如果有记录,则清除它再次显示正常视图等...

我现在想作弊的人很少,所以这可能是一个令人满意的解决方案……理论上,缓存不会因为他们而被不断清除,幸运的是!

但我想知道您是否有其他解决方案?谢谢 !

4

1 回答 1

4

<=2.1版本中,ESI URL 来自于导入 internal.xml 路由文件,该文件公开了一个常规 Symfony 路由,该路由能够呈现任何控制器。

如果普通用户可以访问它,他们可以在您的系统中使用任何参数渲染任何控制器,这是您当前面临的问题。

>=2.2中,internal.xml 路由文件不见了。您现在有一个 Fragments 键config.yml。这不是一个路由,而是激活一个监听器,它监视任何以 开头的请求/_proxy,这是 ESI 标记现在呈现的 URL。

仅此一项并不能提高安全性,除了侦听器在内部使用了一些技巧。

那么是什么阻止了一个邪恶的用户利用这个 URL 来渲染我们系统中的任何带有参数的控制器呢?自 以来2.2,有两种内置保护:受信任的代理和签名的 URL。

处理所有这些魔法的类称为FragmentListener. 在它开始为您的应用程序提供任何服务之前,它首先检查请求的人是否“受信任”。

如果您使用像 Varnish 这样的反向代理,那么您需要将其 IP 地址或 - 超级极客的 CIDR IP 地址范围 - 添加到您的 config.yml 文件中:

framework
    trusted_proxies:
        - 192.168.12.0

如果请求来自此 IP 或范围,则允许。而且,如果它来自本地地址,它也允许它。换句话说,如果是你信任的人,那就没问题了。

于 2013-05-29T16:45:28.247 回答