X-Frame-Optionsヘッダーが原因でページがフレームに表示されないことを検出する良い方法はありますか?サーバーサイドでページをリクエストしてヘッダーを探すことができることは知っていますが、ブラウザにこのエラーをキャッチするメカニズムがあるかどうか知りたいと思いました。
8 に答える
免責事項:私が2012年に書いたこの回答(当時のChromeのバージョンは〜20でした)は古くなっているため、歴史的な目的でのみここに保持します。ご自身の責任で読んで使用してください。
わかりました、これは少し古い質問ですが、これが Chrome/Chromium について私が見つけたものです (完全な答えではありません)。
外部アドレスを指すフレームがロードされたかどうかを検出する方法は、その contentWindow またはドキュメントにアクセスすることです。
ここに私が使用したコードがあります:
element.innerHTML = '<iframe class="innerPopupIframe" width="100%" height="100%" src="'+href+'"></iframe>';
myframe = $(element).find('iframe');
じゃあ後で:
try {
var letstrythis = myframe.contentWindow;
} catch(ex) {
alert('the frame has surely started loading');
}
実際、X-Frame-Options がアクセスを禁止している場合は、myFrame.contentWindow
アクセス可能になります。
ここでの問題は、私が「その後、後で」と呼んだものです。何を頼りにすればよいか、どのイベントをサブスクライブして、いつテストを実行するのが適切かを判断する必要があるかはまだわかりません。
少なくとも Chrome では、iframe.onload イベントがトリガーされないため、ロードの失敗に気付くことができます。これは、ページで iframe が許可されていない可能性があることを示す指標として使用できます。
私が考えることができる唯一のことは、URLのAJAXリクエストをプロキシし、ヘッダーを見て、X-Frame-Optionsがない場合はiframeに表示することです。理想にはほど遠いですが、何もないよりはましです。
これは次の方法で達成できます。
a) CreateElement を介して新しい IFrame を作成する
b)表示を「なし」に設定します
c) src 属性を介して URL をロードする
d) iframe が読み込まれるのを待つために、SetTimeOut メソッドを使用して関数呼び出しを遅らせます (呼び出しを 10 秒遅らせました)。
e) その関数で、ContentWindow の長さを確認します。
f) 長さが 0 より大きい場合、URL が読み込まれます。それ以外の場合、X-Frame-Options のために URL は読み込まれません。
以下はサンプルコードです。
function isLoaded(val) {
var elemId = document.getElementById('ctlx');
if (elemId != null)
document.body.removeChild(elemId);
var obj= document.createElement('iframe');
obj.setAttribute("id", "ctlx");
obj.src = val;
obj.style.display = 'none';
document.body.appendChild(obj);
setTimeout(canLoad, 10000);
}
function canLoad() {
//var elemId = document.getElementById('ctl100');
var elemId = document.getElementById('ctlx');
if (elemId.contentWindow.length > 0) {
elemId.style.display = 'inline';
}
else {
elemId.src = '';
elemId.style.display = 'none';
alert('not supported');
}
}