2013-05-29 45 views
1

我现在面临一个安全问题ESISymfony2的(2.2)例如,要求用户进行日志记录并具有角色ROLE_USER。安全ESI问题与Symfony2的

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

例如,我的ESI“SybioWebsiteBundle:控制器: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和嫩枝模板中,这个ESI被称为......但所有人都可以通过这个“问题”作弊和阅读!

我搜索的解决方案,我得到了一个真难看: 检查,如果用户在ESI的动作,记录......没关系,但我使用HTTP缓存验证优化我的网站加载(记忆) 。所以如果我选择这个解决方案,我需要添加一个额外的ETag来测试用户角色,每当ESI用户没有用户访问时清除ESI缓存,并显示一个空的响应,如果有人登录,清除它再次显示正常的看法,等等...

我现在想要欺骗的人将不常见,所以它可能是一个可喜的解决方案......理论上,缓存不会一直清除,因为他们,幸运!

但我想知道你是否有另一种解决方案?谢谢 !

回答

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地址范围 - 添加到您的配置中。yml文件:

framework 
    trusted_proxies: 
     - 192.168.12.0 

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

+1

不错的答案,谢谢! – Sybio