这很奇怪,我想知道是否有人可以解释为什么会这样。
基本上,我一直在努力测试 JSONP,这样我就可以实现其他网站可以使用的 JSON Web 服务。我正在本地主机上进行开发——特别是 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)。什么都没发生!
我已经坚持了一周,甚至在指定端口上的 Telnet 中使用手动键入的 HTTP 请求进行了测试,以确保服务器正在返回格式......
callbackfn({abc : 'def'})
..它是。
然后我突然想到,如果我使用全球化器('.')将主机名从 localhost 更改为 localhost,例如http://localhost.:41559/而不是http://localhost:41559/(是的,添加一个点到任何主机名都是合法的,它是 DNS 什么global::
是 C# 命名空间)。然后它起作用了!当我刚刚添加一个点时,Internet Explorer 和 Firefox 3.5 终于向我显示了一条警告消息。
所以这让我想知道,这里发生了什么?为什么后期脚本标记生成可以使用 Internet 主机名而不是普通 localhost?或者这是正确的问题?
显然,这是出于安全原因而实施的,但他们试图保护什么?而且,通过让它与点一起工作,我是否只是在此安全功能中暴露了一个安全漏洞?
顺便说一句,我的 hosts 文件虽然针对其他主机进行了更改,但与 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);
}
}