ROLE_NO_ACCESS
为什么Symfony 2 The Book, Security链接中需要规则?不应该access_control
像白名单那样工作(只有通过列出的规则之一的用户才能访问路径)?我用谷歌搜索了一下,找到了这个链接,当缺少附加规则时,Fabien 在这里谈到了安全漏洞,access_control
但我仍然不太明白为什么需要它?我是否总是需要将“匹配所有用户并拒绝”规则指定为最后一个,以正确保护机密路径?
1 回答
强烈建议这样做,因为理论上所有用户都可以访问您的 esi!但是您只需要保护“机密”的 ESI(例如,您不希望用户看到您的管理员 ESI...)
我遇到了这个问题,如何在这里保护我的 ESI: Security ESI issue with symfony2
引用我自己的话:
例如,我的 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 的 URL,因此可以在导航器中单独阅读它们。当然,您首先需要找到 URL(这可能很困难),而且没有一个 lambda 用户知道这一点。但是有见识的黑客(知道 Symfony)可以找到 ESI 路径。
通过添加此代码(自 SF 2.3 起):
access_control:
- { path: ^/esi, roles: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] }
- { path: ^/esi, roles: ROLE_NO_ACCESS }
您说只有当服务器本身(IP 127.0.0.1)调用 ESI 时才能访问 ESI,因此从加载 ESI 的站点页面访问,而不是由从其 URL 直接加载 ESI 的黑客访问!用户不能通过访问不应该看到的 ESI 来作弊!
编辑 :
为了回答您的评论,我将尝试解释该过程:
事实上,这是一个关于安全覆盖的故事。
作弊情况:
假设您在作弊并直接将 URL 粘贴到您的导航器中并加载 ESI。您的 IP 将类似于“88.102.155.96”。
我们在安全配置中首先看到的内容:
- { path: ^/esi, roles: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] }
正如我们所看到的,我们正在尝试访问与“^/esi”匹配的路径,这是我们的情况,但我们还需要 IP 127.0.0.1(如果您使用的是 IPv6,则为 ::1)。不满足条件,我们跳过这一行到下一行:
- { path: ^/esi, roles: ROLE_NO_ACCESS }
路径匹配“^/esi”,好的,我们没有角色“ROLE_NO_ACCESS”。条件满足。所以我们禁止访问(事实上,这是保护您的 ESI 的一个技巧,角色“ROLE_NO_ACCESS”当然永远不会分配给您的应用程序的用户!)。如果你想更明确一点,你可以称它为“ROLE_ESI_PROTECTION”。
因此,在这种情况下,ESI 得到了很好的保护!
如果您忘记了这一行,框架将搜索下一行,它会匹配默认情况下所有 URL 都是公共的行,因此将显示 ESI,即使它应该只包含在受保护的管理页面中(例如)... :
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY
正常页面加载情况:
您点击了受角色“ROLE_ADMIN”保护的管理页面。此页面在其 Twig 模板中包含一个 ESI。
如果我没有“ROLE_ADMIN”,则无法访问此页面,因此无法读取包含的 ESI。如果我想作弊(假设我知道 ESI URL),我不能,因为你已经用角色“ROLE_ESI_PROTECTION”(或“ROLE_NO_ACCESS”)保护了你的 ESI,我陷入了前面看到的“作弊情况”。
现在,如果我可以访问该页面,因为我拥有所需的角色,该怎么办:
- 页面已加载
该页面尝试通过调用它的 URL 来包含 ESI:
- { path: ^/esi, roles: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] }
由于是读取ESI等服务器的页面,IP地址为“127.0.0.1”(只有这个IP),所以 条件满足,访问被授权!框架在此处停止读取您的 security.yml 文件的“access_control”,它不检查其他行。(就像 PHP 中的开关/中断条件)。
- ESI 包含在页面中
总而言之,本应保密的 ESI 受到了很好的保护,因为它们只能通过用户可以使用自己的角色访问的页面显示,而不是通过直接在导航器中输入 ESI 的 URL 的作弊方式显示。
用户被封装。
我再清楚不过了,希望你理解这个概念;)