1

Symfony2 (2.2)のESIでセキュリティの問題に直面しています:

私のアプリケーションの一部の ESI は、ログに記録する必要がなく、公開されていますが、他の ESI では、ユーザーがログに記録され、ロール ROLE_USER を持つ必要があります。

問題は、ナビゲーターのアドレスバーに URL を書き込むことで、すべての人が ESI を表示できることです...そのため、管理者の役割を必要とするアクション内で呼び出される ESI にアクセスできます。 !

たとえば、私の 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 は、ログに記録されたユーザーのみが表示できます。ユーザーは showAction に移動し、Twig テンプレート内でこの ESI が呼び出されます。

解決策を検索しましたが、非常に醜いものがあります。ユーザーが ESI アクションにログインしているかどうかを確認してください...問題ありませんが、HTTP キャッシュ検証を使用してサイトの読み込み (およびメモリ) を最適化しています。したがって、この解決策を選択した場合は、ユーザーの役割をテストする追加の ETag を追加して、ユーザーが ESI にアクセスするたびに ESI キャッシュをクリアし、空の応答を表示し、ログに記録された場合はそれをクリアする必要があります。再び、通常のビューなどを表示します...

チートをしたい人は珍しいので、それは満足のいく解決策になるかもしれません... 理論的には、幸運なことに、キャッシュが常にクリアされるわけではありません!

しかし、別の解決策があるかどうか知りたいですか?ありがとう !

4

1 に答える 1

4

バージョンでは、ESI URLは<=2.1、任意のコントローラーをレンダリングできる通常の Symfony ルートを公開する internal.xml ルーティング ファイルのインポートから取得されました。

通常のユーザーがこれにアクセスできる場合、システム内の任意の引数を使用して任意のコントローラーをレンダリングできます。これが現在直面している問題です。

では>=2.2、internal.xml ルーティング ファイルがなくなりました。これで、フラグメント キーが に作成されましたconfig.yml/_proxyルートの代わりに、これは、ESI タグが現在レンダリングする URL である で始まるすべての要求を監視するリスナーをアクティブにします。

リスナーが内部でいくつかのトリックを使用することを除いて、これだけではセキュリティには役立ちません。

では、悪意のあるユーザーがこの URL を悪用して、システム内の任意のコントローラーを任意のパラメーターでレンダリングするのを防ぐにはどうすればよいでしょうか? 以来2.2、信頼できるプロキシと署名付き URL という 2 つの組み込みの保護機能があります。

このすべての魔法を処理するクラスは と呼ばれFragmentListenerます。アプリケーションから何かを提供し始める前に、まず、要求している人物が「信頼できる」かどうかを確認します。

Varnish のようなリバース プロキシを使用している場合は、その IP アドレスまたは - 超オタク向けの CIDR IP アドレス範囲 - を config.yml ファイルに追加する必要があります。

framework
    trusted_proxies:
        - 192.168.12.0

リクエストがこの IP または範囲からのものである場合、それは許可されます。また、ローカル アドレスから送信された場合は、それも許可されます。つまり、信頼できる人なら大丈夫です。

于 2013-05-29T16:45:28.247 に答える