symfony2的安全ESI问题

时间:2013-05-29 15:13:03

标签: security caching symfony esi

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

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

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

例如,我的ESI" SybioWebsiteBundle:Controller:showEsiAction"可以在以下网址阅读: 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缓存,并显示空响应,如果记录了一个,则清除它再次显示正常视图等...

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

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

1 个答案:

答案 0 :(得分:4)

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

如果普通用户有权访问此项,他们可以使用您系统中的任何参数呈现任何控制器,这是您目前面临的问题。

>=2.2中,internal.xml路由文件消失了。您现在在config.yml中有一个片段密钥。这将激活监听器,而不是路由,该监听器监视以/_proxy开头的任何请求,这是ESI标签现在呈现的URL。

除了侦听器在内部使用一些技巧外,仅此一点对安全性没有帮助。

那么是什么阻止恶意用户利用这个URL来使用任何参数呈现我们系统中的任何控制器?自2.2起,有两种内置保护:可信代理和签名URL。

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

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

framework
    trusted_proxies:
        - 192.168.12.0

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