これは奇妙なことです。誰かがなぜこれが起こったのかを明らかにできるかどうか疑問に思っていました.
基本的に、他のサイトが使用できる 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);
}
}