私のウェブサイトはユーザーに豊富なコンテンツを提供しています。私は自分のページにコンテンツを埋め込んでいるサードパーティベンダーをよく購読しています。外部ドメインのコンテンツがフレーム外にバストできないことを心配せずに、外部ドメインのコンテンツをWebページのiframeに安全に埋め込むにはどうすればよいですか。彼らは意図的にそれをしません(彼らの顧客/評判を危険にさらすことなしに)。ただし、ほとんどの場合小さな店であるため、私のWebサイトを改ざん/リダイレクトしたい攻撃者にとってはジューシーなターゲットになります。
親ページで使用できるヘッダー(X-Frame-Optionsに似たもの/反対のもの)はありますか?埋め込まれたiframeがバストアウトしないようにするためですか?ベンダーにヘッダー/スクリプトをページに追加するよう依頼することはできません。彼らはわざわざ私のページに悪質なことをしたくありません。私がカバーしようとしているシナリオは、彼らがハッキングされたときのものです。
sandbox 属性が必要です。これは すべての主要ブラウザ でサポートされている新しい属性です。サンドボックス属性はiframe内のコンテンツに追加の制限を課します-それらの制限の1つはJavaScriptの実行です。強制したくない他の制限を削除することを選択できます。
以下を使用して、異なる/信頼されていないドメインのURLをWebページに埋め込みます。
<iframe src="http://example.com/external-content.htm" sandbox></iframe>
以下はクイックリファレンスです(上記のw3schoolsリンクからコピー)。
サンドボックス属性が存在すると、次のようになります。
- コンテンツを独自のオリジンからのものとして扱う
- フォーム送信のブロック
- スクリプトの実行をブロックする
- aPIを無効にする
- リンクが他のブラウジングコンテキストをターゲットにしないようにする
- コンテンツがプラグインを使用できないようにする(、、、またはその他)
- コンテンツが最上位のブラウジングコンテキストをナビゲートできないようにします(これが必要です)
- 自動的にトリガーされる機能(ビデオの自動再生やフォームコントロールの自動フォーカスなど)をブロックする
簡単な検索の結果、これに関する2つの関連するStackOverflow(SO)質問が見つかりました。
これらの質問は少し古いですが、親(上位)リダイレクトを防ぐために次のコードを適用することをお勧めします。
<script type="text/javascript">
var prevent_bust = 0;
window.onbeforeunload = function() { prevent_bust++; }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2;
window.top.location = 'http://example.org/page-which-responds-with-204';
/* Replace URL with a page that actually responds with HTTP status code 204 */
}
}, 1);
</script>
基本的に、このJavaScriptのスニペットは、iframeされたページがtop.location
;したがって、このコードはiframeのリダイレクトを防ぎます。
2番目のSO質問はこのコードの元のソースでしたが、その質問はこのiframe-buster無効化コードを無効にする方法を求めていました。(つまり、SOソース#2は、iframeリダイレクトを防止するこのコードをバイパスする方法を探していました。)しかし、このアンチリダイレクトコードを回避するための実行可能なソリューションは提供されていないようです。したがって、これはかなり安全なソリューション。
もちろん、別のWebサイト/サーバーからiframeまたは他のコードを含めるときはいつでも、そうすることによっていくつかのリスクを継承します。ただし、これはそのリスクを軽減するための実行可能な解決策になるはずです。