2013-05-29 49 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