【发布时间】:2010-11-16 02:50:30
【问题描述】:
这很奇怪,我想知道是否有人可以解释为什么会这样。
基本上,我一直在努力测试 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);
}
}
【问题讨论】:
-
我建议使用 firebug 之类的工具,看看是否正在为 JSONP 内容执行“脚本”请求,并实际查看返回的数据。
-
数据有效。如上所述,解决方法是远离 localhost(否则脚本和数据保持不变)并“修复”它,但不能完全解释发生了什么。
-
是的,这就是为什么我建议记录未修复版本的事件。
-
我做到了,卢卡。感谢您的建议。
标签: javascript localhost jsonp xss