这很奇怪,我想知道是否有人可以解释为什么会发生这种情况。
基本上,我一直试图测试JSONP,所以我可以实现其他网站可以使用的JSON Web服务。我正在localhost上进行开发 - 特别是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中测试了这个。两个人都不会调用回调。从未达到过捕获(错误)。什么都没发生!
我已经坚持了一个星期,甚至在指定端口上的Telnet中使用手动键入的HTTP请求进行测试,以确保服务器返回格式...
callbackfn({abc : 'def'})
..它是。
然后我突然意识到,如果我使用globalizer('。')将主机名从localhost更改为localhost,即http://localhost.:41559/而不是http://localhost:41559/(是的,在任何主机名中添加一个点)是合法的,它是DNS {C}命名空间global::
的内容。然后它奏效了!当我刚添加一个点时,Internet Explorer和Firefox 3.5终于向我显示了一条警告消息。
所以这让我想知道,这里发生了什么?为什么后期脚本标记生成使用Internet主机名而不是普通的localhost?或者这是正确的问题?
显然,这是出于安全原因而实施的,但他们试图确保什么?并且,通过使用点来处理它,我是否只是在此安全功能中暴露了一个安全漏洞?
顺便说一句,我的主机文件,虽然改为其他主机,但没有任何特殊的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);
}
}
答案 0 :(得分:3)
我要在那里提出答案;经过一番思考后,我得出了自己的结论。
可能是这是一个安全功能,旨在阻止Internet网站调用客户端计算机上运行的JSONP服务。
网站可以浏览一个端口列表,并继续在不同的端口和路径上调用localhost。 “Localhost”是少数几个具有动态意义的DNS主机名之一,具体取决于查询的时间和地点,使潜在目标易受攻击。是的,将一个点(。)附加到'localhost'('localhost。')产生一个可行的解决方法的事实确实暴露了一个安全漏洞,但确实为开发目的提供了[试验性]解决方法。
更好的方法是将环回IP映射到hosts文件中的新主机名条目,以使其在本地工作,不易被浏览器更新“修复”,并且在其他任何地方都无法正常工作。开发工作站。
答案 1 :(得分:1)
我遇到了类似的问题。我尝试过的大多数解决方案都使用IE(7),但是我很难让Firefox(3.5.2)玩球。
我已经安装了HttpFox,以便了解我的服务器响应是如何在客户端上解释的,而且我得到的是NS_ERROR_DOM_BAD_URI。我的情况与你的情况略有不同,因为我正在尝试将JSONP调用回到托管页面来自同一站点,然后此调用响应302重定向到另一个站点。 (我使用重定向作为从两个域返回浏览器的cookie的便捷方式。)
我正在使用jQuery,我最初尝试通过$ .ajax()进行标准的AJAX调用。我认为,由于初始请求是与托管页面相同的站点,Firefox只会跟随对另一个域的302响应。但不,它似乎违反XSS防御。 (请注意,与Returning redirect as response to XHR request所暗示的相反,jQuery遵循302重定向进行标准dataType =“json”调用:重定向到同一个域的工作正常;重定向到另一个域会在浏览器中生成NS_ERROR_DOM_BAD_URI。)顺便说一句,我不明白为什么同域302重定向到其他域不能只是被遵循 - 毕竟,它是发布重定向的托管页面的域,所以为什么它不可信任?如果您担心脚本注入攻击,那么无论如何JSONP路由都会被滥用......
jQuery的$ .getJSON()带有?callback =?后缀也在Firefox中失败并出现相同的错误。就像使用$ .getScript()滚动我自己的JSONP&lt; script&gt;一样标签
看似有效的是,预先存在&lt; script id =“jsonp”type =“text / javascript”&gt;&lt; / script&gt;在HTML中,然后使用$(“jsonp”)。attr(“src”,url +“?callback = myCallback”)来调用JSONP调用。如果我这样做,那么遵循跨域302重定向,我将我的JSON响应传递给myCallback(我在&lt; script /&gt;标记的同时定义)。
而且,是的,我正在使用Cassini和localhost: port URL开发所有这些。 Cassini不会回复非本地主机URL,所以我不能轻易尝试local.mysite.com来查看这是否对我上面尝试过的解决方案有任何影响。但是,在localhost的末尾添加一个点似乎已经解决了我所有的问题!
现在我可以回到标准的$ .ajax({... dataType:“jsonp”...})调用localhost __.__: port 而不是localhost:端口一切都很好。我觉得有趣的是修改页面的HTML 中预先存在的脚本标记的src属性允许调用普通的本地主机URL - 我想跟着你的思考过程,这可能是另一个安全漏洞