これがAjaxに影響を与える理由は、Ajaxが同一生成元ポリシールールによって管理されており、サンドボックス化すると、iframe
コンテンツを別のオリジンからのものであるかのように扱うようにブラウザーに効果的に指示しているためです。同じ記事を引用する:
- ユニークな起源の治療。すべてのコンテンツは、固有のオリジンの下で扱われます。コンテンツはDOMをトラバースしたり、Cookie情報を読み取ったりすることはできません。
これは、同じドメインからのコンテンツでさえ、各IFRAMEコンテンツが一意のオリジンとして表示されるため、クロスドメインポリシーで扱われることを意味します。
埋め込まれたコンテンツは、情報の表示のみが許可されています。IFRAME内で、ホスティングWebサイトを危険にさらしたり、ユーザーの信頼を利用したりする可能性のある他のアクションを実行することはできません。
つまり、属性でallow-same-origin
inを省略sandbox
すると、サンドボックス化されたページが別のドメインに属しているものとして扱われます(実際には、null
オリジンを持つものとして扱われます)。Ajaxリクエストを行うのは意味がないためnull
、サンドボックス化されたページはAjax呼び出しをまったく行うことができません(許可された場合localhost
、親ページからの呼び出しと区別がつかなくなり、サンドボックス化の目的が損なわれます)。
追加情報
別のドメインにAjax呼び出しを行おうとすると、明らかに失敗します。
<script src="http://code.jquery.com/jquery.min.js"></script>
<script>
console.log(location.host);
$.post('https://google.com/',{},function() { });
</script>
ただし、どのように失敗するかは、使用するサンドボックス属性によって異なります。上記のページをに埋め込むと、次のようiframe
にallow-same-origin
コンソールに出力されます。
localhost
XMLHttpRequest cannot load https://google.com/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
...そしてあなたがそれなし allow-same-origin
でそれを埋め込むならば:
localhost
XMLHttpRequest cannot load https://google.com/. Cannot make any requests from null.
location.host
両方ともとして報告されlocalhost
ますが、一方は発生源であると見なし、http://localhost
もう一方は発生源であると見なしたことに注意null
してください(例で発生したのと同じエラーメッセージが表示されます)。
推論
同じドメインのサンドボックス化されたコンテンツからのAjax呼び出しをブロックすることがなぜそれほど重要なのですか?記事で説明されているように:
同じドメインのコンテンツは安全でなければならないというのは理にかなっています。ここでのリスクは主に、 IFRAMEで再ホストされるユーザー生成コンテンツに起因します。
例を挙げましょう。Facebookがユーザーが自分のページに小さなHTML5アニメーションを投稿できるようにすることを決定したとします。それらを独自のサーバーに保存し、表示時にサンドボックス化しますallow-scripts
(アニメーションが機能するにはスクリプトが必要なため)が、他のすべては拒否されたままにします(特にallow-same-origin
、ユーザーコードが親ページを台無しにしたくないため) )。Ajax呼び出しもデフォルトでブロックされていなかった場合はどうなりますか?
マロリーは、次の要素で構成される「アニメーション」を作成します。
API(Open Graphなど)を使用してFacebookへのAjax呼び出しを実行します。サーバーは、リクエストが発信元としてのページから来たことをすべて知っているので、喜んで呼び出しを受け入れますhttps://facebook.com
。
返されたデータをクエリ文字列として使用して、自分のサーバーを指すURIを作成しsrc
、サンドボックス化されたページの画像として設定します。
アリスがマロリーのプロフィールにアクセスしてアニメーションを見ると、上記のスクリプトが実行されます。
Ajax呼び出しは、Aliceがログオンしている間、Aliceのブラウザーで実行されます。サーバーは呼び出しがどこから来たのか(メインページまたは埋め込みページ)を知らないため、個人情報の取得を含め、要求されたすべてのことを実行します。
要素がマロリーのURIで作成される場合img
、画像は同一生成元ポリシーから免除されるため、ブラウザは通常どおり「画像」を読み込もうとします。
URIのクエリ文字列にはアリスのプライベート情報が含まれているため、マロリーのサーバーはそれを保存して、必要な画像を返すことができます。現在、マロリーはアリスの個人情報を持っており、アリスは何も疑っていません。