web-dev-qa-db-ja.com

ターゲット属性が「_blank」に設定された<a>タグを介してリンクが開かれると、XSRFエラーが発生する

これまでに直面したことのない独特のバグに遭遇しました。必要な詳細を提供できますが、できるだけ一般的になるようにします。

異なるドメイン上の他のアプリケーションにリンクするイントラネットポータルがあります。ポータルページ上のすべてのリンクは、タグ内のtarget = "_ blank"を介して、対応するアプリケーションを新しいタブで開きます。これらの外部アプリケーションの1つは、Outlook Web App(OWA)を介したMS Exchangeです。このアプリのURLはhttps:// exchangeです。 company.com OWAには、 https://exchange.company.com/ecp のコンテンツを含むiframeをロードするリンクが含まれています。

バグは次のとおりです。ユーザーがポータルページのOWAリンクをクリックして新しいタブを開くと、そのiframeコンテンツの取り込みに失敗します。これは、ユーザーが受け取るエラーメッセージからの抜粋です。

技術情報:キャッチされていないSecurityError:Origin " https://exchange.company.com "のフレームがクロスオリジンフレームにアクセスするのをブロックしました。

この動作は、ChromeおよびFirefoxの最新バージョンでは明らかですが、IEの最新バージョンではnotに存在します。

奇妙なことは、target = "_ blank"がタグから削除されている場合、ユーザーがブラウザに手動でURLを入力するとORとiframeが100%正しく読み込まれることです。

テストするために、https:// exchangeへの新しいタブリンクのみを含む中間ページを作成してみました。会社。 comで、ポータルのリンクを変更して、代わりにそのページを指すようにします-同じバグ。

これは、Chrome/FFがパッチを適用したセキュリティ脆弱性であり、実際、ブラウザは設計どおりに動作していると思いますが、このロジックのレンチは、「ユーザーが手動で入力したときにエラーなく動作するのはなぜですか」 URLで、またはtarget = "_ blank"なしのタグを使用してURLに到達しますか?iframe isは、Originサーバー(https:// exchange。company。com)と同じドメインにあります。私が理解している限りでは、XSRFエラーは発生しません。

私はLAMP/Drupalの男で、ポータルページの問題としてチケットシステムに入ってきたので、これに引き込まれました。 Exchange管理者に彼の洞察を求めましたが、彼も途方に暮れています。システムチームが電話でExchangeをインストールするために使用したMSコンサルタントにこれについて尋ねる予定ですが、ここで誰かがこれを引き起こす可能性のあるアイデアを持っているのではないかと思いました。同じタブでそのリンクを開くときに維持されない(または維持される)target = "_ blank"のリンクを使用する場合、ブラウザーによって維持される(または維持されない)データは何ですか?どんなアドバイスも大歓迎です。私は今のところこれに迷っています。

読んでくれてありがとう。

編集:Exchangeを新しいウィンドウで開く必要がある理由を尋ねる場合があります-それは難しい要件だと言いましょう。 SSOサービスを使用するため、ユーザーはログアウト後にブラウザーを完全に閉じる必要があります。そのため、すべてのポータルリンクを新しいタブで開くための規則があり、元のポータルページは開いたままで、ユーザーがまだログインしていることを思い出させます。多くの共有ワークステーションがあるため、同じタブでExchangeを開くことができ、ユーザーがExchangeを閉じると、ポータルにまだログインしていることに気付かず、セッションが別のユーザーに乗っ取られる可能性があります。元のポータルウィンドウを常に開いたままにしておくことにより、少なくともユーザーは、コンピューター時間の終わりにタブを閉じる際にセッションがアクティブであることを思い出させられます。

つまり、target = "_ blank"を使用しない新しいタブでURLを開く別の方法を知っている場合(したがって、target = "_ blank"が実行しているバグを回避するためにバイパスする)、それで十分です。同様に修正します(根本的な原因に到達したいのですが)。

4
Tim

私のテストでは、Firefox 41とChrome 45​​が影響を受けます。 IE 11およびSafari 8はそうではありません。これらのブラウザの他のバージョンはテストしていません。

どうやら、あるページが新しいウィンドウ/タブで別のページを開くと、相互に対話する能力が制限されます。子ウィンドウでは、これはwindow.opener JavaScriptオブジェクト経由です。 [「 reverse tabnapping 」を参照してください。)どういうわけか、FirefoxとChromeは、この新しいウィンドウの「Origin」と交差しているようです。 OWAは、さまざまなオプションページでiframeを開き、iframeと対話しようとします。この問題はtarget="_blank"に固有のものではありませんが、存在しない名前付きターゲットを指定することで、新しいタブ/ウィンドウを有効にすることもできます。 target="newExchangeWindow"ですが、そうすると、target="_blank"で同じ動作が観察されます。

興味深いことに、この動作は、一見すると任意の数の中間ページにわたって持続します。リンクをクリックして新しいタブを開き、いくつかの異なるサイトを閲覧し、OWAに移動すると、問題はまだ存在します-それは単なる問題ではありませんOWA自体を新しいタブで開くリンクがあります!また、URLを直接入力しても解決できません。タブは、存在する間は「壊れている」ように見えます。

これを解決できるいくつかの方法を見つけることができました。

オプション0:
リンクからtarget="_blank"を削除します。
明らかにマイナス面は、これはあなたの要件を解決しないことです(私の場合も)、少なくともユーザーは署名などを設定できます!

オプション1:
リンクにrel="noreferrer"を追加します。
<a href="https://exchange.company.com" target="_blank" rel="noreferrer">OWA</a>
これは、FirefoxとChromeの両方の現在のバージョンで動作します。私のテストでは、そもそもSafariには元の問題は存在しませんが、Safariでは機能しないという提案を見てきました。それでも、これは信頼できない可能性があることを示している可能性があります。

オプション2:
中間ページのwindow.openerオブジェクトをたたく、例:

<html>
  <head><title>Clobbering window.opener...</title></head>
  <body onload="window.opener=null;window.location='https://exchange.company.com/'">
  </body>
</html>

明確にするために、この中間ページはtarget="_blank"リンクで開くものです。その仕事は、ユーザーをOWAに移動する前にwindow.openerオブジェクトを上書きすることです。 JavaScriptを無効にしているユーザーを取得する場合に備えて、本文にメタリフレッシュタグやリンクを追加することもできます(ただし、やはりユーザーはOWAをうまく使用できません...)。

オプション3:
OWAにコードを直接挿入することにより、window.openerオブジェクトを削除します。

OWAにコードを挿入するのは簡単なことではありません。私の場合、OWAはBig-Ipロードバランサーの背後にあるため、</head>タグを<script type="text/javascript">window.opener = null;</script></head>で実際に置き換えるiRuleを作成しました。これは問題が存在する場所であるため、/ecp/ページ自体でのみ行いますが、アプリに到着する全員の「ランディングページ」であるため、/owa/ページで行うこともできます。グローバルに実行しないように注意してください。その文字列を含むいくつかの.jsファイルもあります。それらで置換を実行すると、BadThings®が発生すると言うときに私を信頼してください。


私のテストでは、FirefoxとChromeにこの問題がありますが、SafariとIEにはありません。 (使用するユーザーがいないため、Operaをテストしませんでした。)これらのブラウザーの両方で、これらのオプションのいずれかまたはすべてが問題の修正に効果的です。これらの任意の組み合わせを一緒に使用することもできます:rel属性は、もちろん、すべてのリンクに適用できます。また、window.openerオブジェクトが存在しない場合でも、それを壊しても害はありません。すでに破壊されています。

4
Kromey