这很奇怪,我想知道是否有人可以解释为什么会发生这种情况。

基本上,我一直试图测试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来说,global::对C#名称空间是什么。然后它奏效了!当我刚添加一个点时,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);
    }
}
有帮助吗?

解决方案

我要在那里提出答案;经过一番思考后,我得出了自己的结论。

这可能是一个安全功能,旨在阻止Internet网站调用客户端计算机上运行的JSONP服务。

网站可以浏览一个端口列表,并继续在不同的端口和路径上调用localhost。 “Localhost”是少数几个具有动态意义的DNS主机名之一,具体取决于查询的时间和地点,使潜在目标易受攻击。是的,将一个点(。)附加到'localhost'('localhost。')产生一个可行的解决方法的事实确实暴露了一个安全漏洞,但确实为开发目的提供了[试验性]解决方法。

更好的方法是将环回IP映射到hosts文件中的新主机名条目,以便它在本地工作,不容易出现<!> quot; fixed <!> quot;通过浏览器更新,除了在开发工作站上以外的任何地方都不起作用。

其他提示

我遇到了类似的问题。我尝试过的大多数解决方案都使用IE(7),但是我很难让Firefox(3.5.2)玩球。

我已经安装了HttpFox,以便了解我的服务器响应是如何在客户端上解释的,而且我得到的是NS_ERROR_DOM_BAD_URI。我的情况与你的情况略有不同,因为我正在尝试将JSONP调用回到托管页面来自同一站点,然后此调用响应302重定向到另一个站点。 (我使用重定向作为从两个域返回浏览器的cookie的便捷方式。)

我正在使用jQuery,我最初尝试通过$ .ajax()进行标准的AJAX调用。我认为,由于初始请求是与托管页面相同的站点,Firefox只会跟随对另一个域的302响应。但不,它似乎违反XSS防御。 (请注意,与返回重定向作为对XHR请求的响应相反) ,jQuery确实遵循302重定向标准dataType = <!>“json <!>”;调用:重定向到同一个域工作正常;重定向到另一个域在浏览器中生成NS_ERROR_DOM_BAD_URI。)顺便说一下,我不明白为什么同域302重定向到其他域不能只是遵循 - 毕竟,它是发布重定向的托管页面的域,所以为什么它不可信任?如果您担心脚本注入攻击,那么无论如何JSONP路由都会被滥用......

jQuery的$ .getJSON()带有?callback =?后缀也在Firefox中失败并出现相同的错误。就像使用$ .getScript()来滚动我自己的JSONP <!> lt; script <!> gt;标签

看似有效的是,预先存在<!> lt; script id = <!> quot; jsonp <!> quot; <!>类型= QUOT;文本/ JavaScript的QUOT <!>; GT <!>; LT <!>; <!> /脚本GT;在HTML中,然后使用$(<!> quot; jsonp <!> quot;)。attr(<!> quot; src <!> quot;,url + <!> quot;?callback = myCallback <!> quot ;)调用JSONP调用。如果我这样做,那么遵循跨域302重定向,我将我的JSON响应传递给myCallback(我在<!> lt; script / <!> gt;标记的同时定义)。

而且,是的,我正在使用Cassini和localhost: port URL开发所有这些。 Cassini不会回复非本地主机URL,所以我不能轻易尝试local.mysite.com来查看这是否对我上面尝试过的解决方案有任何影响。但是,在localhost的末尾添加一个点似乎已经解决了我所有的问题!

现在我可以回到标准的$ .ajax({... dataType:<!>“; jsonp <!>”; ...})调用localhost __.__: port 而不是localhost: port ,一切都很好。我觉得有趣的是修改页面的HTML 中预先存在的脚本标记的src属性允许调用普通的本地主机URL - 我想跟着你的思考过程,这可能是另一个安全漏洞

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top