11

これは奇妙なことです。誰かがなぜこれが起こったのかを明らかにできるかどうか疑問に思っていました.

基本的に、他のサイトが使用できる JSON Web サービスを実装できるように、JSONP をテストしようとして頭を悩ませてきました。私はローカルホストで開発を行っています。具体的には、Visual Studio 2008 と Visual Studio 2008 の組み込み Web サーバーです。

したがって、jQuery を使用した JSONP テストの実行として、以下を実装しました。

$().ready(function() {
  debugger;
  try {
    $.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
        alert(data.abc);
    });
  } catch (err) {
    alert(err);
  }
});

そしてサーバー上で..

<%= Request["callback"] %>({abc : 'def'})

結局、サーバーにブレークポイントを設定し、最初の「デバッガー」の両方でブレークポイントを取得します。サーバー上だけでなく、クライアント側スクリプト内のステートメント。JSONP URL は、ページの読み込み後に実際に呼び出されています。それはうまくいっています。

私が抱えていた問題は、コールバックが実行されないことでした。これを IE8 と Firefox 3.5 の両方でテストしました。どちらもコールバックを呼び出しません。catch(err) にも到達しませんでした。何も起こりませんでした!

私はこれに1週間行き詰まり、サーバーがフォーマットを返すことを確認するために、指定されたポートのTelnetで手動でキー付けされたHTTPリクエストでテストしました...

callbackfn({abc : 'def'})

..そしてそうです。

次に、ホスト名を localhost から localhost にグローバライザー ('.') で変更するとどうなるか、つまり、 http://localhost:41559/の代わりにhttp://localhost.:41559/ (はい、任意のホスト名へのドットは合法であり、DNSに対しては C# 名前空間に対してです)。そして、それはうまくいきました!Internet Explorer と Firefox 3.5 では、ドットを追加しただけで警告メッセージが表示されるようになりました。global::

ここで何が起こっているのだろうか?後期スクリプト タグ生成がプレーンな localhost ではなく、インターネット ホスト名で機能するのはなぜですか? それともそれは正しい質問ですか?

明らかにこれはセキュリティ上の理由から実装されていますが、何を保護しようとしているのでしょうか?? そして、それをドットで動作させることで、このセキュリティ機能のセキュリティ ホールを明らかにしただけでしょうか?

ところで、私のホスト ファイルは、他のホスト用に変更されていますが、ローカルホストでは特別なことは何も行われていません。デフォルトの 127.0.0.1 / ::1 はそのままで、以下のオーバーライドはありません。

フォローアップ:追加することで、ローカル開発の目的でこれを乗り越えました。

127.0.0.1   local.mysite.com

.. hosts ファイルに追加し、global.asax に次のコードを追加します。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (Request.Headers["Host"].Split(':')[0] == "localhost")
    {
        Response.Redirect(
            Request.Url.Scheme
            + "://"
            + "local.mysite.com"
            + ":" + Request.Url.Port.ToString()
            + Request.Url.PathAndQuery
            , true);
    }
}
4

2 に答える 2

3

私はそこに答えを投げるつもりです。少し考えた後、私は自分の結論に達しました。

これは、インターネット Web サイトがクライアント マシンで実行されている JSONP サービスを呼び出さないようにするために実装されたセキュリティ機能である可能性があります。

Web サイトは、ポートのリストを調べて、さまざまなポートとパスで localhost を呼び出し続けることができます。「Localhost」は、照会されるタイミングと場所に応じて動的な意味を持つ数少ない DNS ホスト名の 1 つであり、潜在的なターゲットを脆弱にします。はい、「localhost」(「localhost.」) にドット (.) を追加すると有効な回避策が生成されるという事実は、セキュリティの脆弱性を明らかにしますが、開発目的のための [暫定的な] 回避策を提供します。

より良いアプローチは、ループバック IP をホスト ファイルの新しいホスト名エントリにマップして、ローカルで機能し、ブラウザーの更新によって「修正」される傾向がなく、開発ワークステーション以外では機能しないようにすることです。 .

于 2009-08-02T02:09:42.293 に答える
1

同様の問題が発生しています。私が試したソリューションのほとんどは IE (7) で動作しますが、Firefox (3.5.2) でボールをプレーするのに苦労しています。

サーバーの応答がクライアントでどのように解釈されているかを確認するために HttpFox をインストールしましたが、NS_ERROR_DOM_BAD_URI を取得しています。ただし、私の状況はあなたの状況とは少し異なります.JSONPコールバックをホスティングページの元のサイトと同じサイトに戻そうとしているのですが、このコールは別のサイトへの302リダイレクトで応答しています. (私はリダイレクトを、両方のドメインからの Cookie をブラウザーに返す便利な方法として使用しています。)

私はjQueryを使用していますが、もともと$.ajax()を介して標準のAJAX呼び出しを試みました。最初のリクエストはホスティング ページと同じサイトに対するものだったので、Firefox は別のドメインへの 302 レスポンスをたどるだけだろうと考えました。しかし、そうではありません。XSS 防御に違反しているように見えました。( XHR リクエストへの応答としてリダイレクトを返すのとは逆に注意してください。つまり、jQuery は標準の dataType="json" 呼び出しの 302 リダイレクトに従います。同じドメインへのリダイレクトは正常に機能します。別のドメインへのリダイレクトは、ブラウザーで NS_ERROR_DOM_BAD_URI を生成します。) 余談ですが、他のドメインへの同じドメインの 302 リダイレクトをたどることができない理由がわかりません。結局のところ、リダイレクトを発行しているのはホスティング ページのドメインです。 、では、なぜ信頼できないのでしょうか。スクリプト インジェクション攻撃が心配な場合は、とにかく JSONP ルートが悪用される可能性があります...

jQuery の $.getJSON() と ?callback=? suffix は Firefox でも同じエラーで失敗します。$.getScript() を使用して独自の JSONP <script> タグをロールするのと同じように。

うまくいくように見えるのは、HTMLに既存の <script id="jsonp" type="text/javascript"></script> を持っていて、 $("jsonp").attr("src", url + "?callback=myCallback") を使用して、JSONP 呼び出しを呼び出します。これを行うと、クロスドメイン 302 リダイレクトが実行され、JSON 応答が myCallback (<script/> タグと同時に定義した) に渡されます。

そして、はい、私は localhost:ポートURL で Cassini を使用してこれらすべてを開発しています。Cassini は localhost 以外の URL には応答しないため、上記で試したソリューションに影響があるかどうかを確認するために local.mysite.com を簡単に試すことはできません。ただし、localhost の最後にドットを付けると、すべての問題が解決したようです。

これで、標準の $.ajax({ ... dataType:"jsonp" ... }) 呼び出しに戻り、localhost__.__: portの代わりに localhost: portを呼び出して、すべて問題ありません。ページの HTML にあらかじめ存在するスクリプト タグの src 属性を変更すると、通常の localhost URL を呼び出せるようになるのは興味深いことです。あなたの思考プロセスに従っていると思いますが、これは別のセキュリティ上の脆弱性である可能性があります。

于 2009-08-12T09:50:41.640 に答える