0

ROLE_NO_ACCESS为什么Symfony 2 The Book, Security链接中需要规则?不应该access_control像白名单那样工作(只有通过列出的规则之一的用户才能访问路径)?我用谷歌搜索了一下,找到了这个链接,当缺少附加规则时,Fabien 在这里谈到了安全漏洞,access_control但我仍然不太明白为什么需要它?我是否总是需要将“匹配所有用户并拒绝”规则指定为最后一个,以正确保护机密路径?

4

1 回答 1

3

强烈建议这样做,因为理论上所有用户都可以访问您的 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,我陷入了前面看到的“作弊情况”。

现在,如果我可以访问该页面,因为我拥有所需的角色,该怎么办:

  1. 页面已加载
  2. 该页面尝试通过调用它的 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 中的开关/中断条件)。

  3. ESI 包含在页面中

总而言之,本应保密的 ESI 受到了很好的保护,因为它们只能通过用户可以使用自己的角色访问的页面显示,而不是通过直接在导航器中输入 ESI 的 URL 的作弊方式显示。

用户被封装。

我再清楚不过了,希望你理解这个概念;)

于 2013-08-06T19:54:08.957 回答