在本地主机上运行时JSONP回调不执行(JSONP callback doesn't exe

2019-06-27 13:30发布

这是奇怪的,我想知道是否有人能揭示为何会发生这样的一些情况。

基本上,我一直在拉我的头发试图测试JSONP出来,所以我可以实现其他网站可以使用JSON Web服务。 我在本地主机上做开发 - 具体而言,Visual Studio 2008和Visual Studio 2008中的内置Web服务器。

因此,作为一个JSONP试运行瓦特/ jQuery的,我实现了以下内容:

$().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'})

那么最终发生的是我设置一个断点在服务器上,我得到的断点都第一个“调试器;” statment在客户端脚本,以及在服务器上。 该JSONP URL确实正在在页面加载后调用。 这是伟大的工作。

我遇到的问题是,回调将不会执行。 我在这两个IE8测试这个问题,以及火狐3.5。 没有一个会调用回调函数。 渔获(ERR)从未达到,无论是。 什么都没有发生的一切!

我一直停留在这一个星期,甚至在指定的端口上,以Telnet手动密钥的HTTP请求进行测试,以确保服务器返回的格式...

callbackfn({abc : 'def'})

..它是。

(“”)于是,我明白了,如果我从本地主机更改主机名与一个全球化者本地主机,即http://localhost.:41559/而不是HTTP://本地主机:41559 / (是的,添加点到任何主机名是合法的,这是DNS什么global::是C#的命名空间)。 然后,它的工作! Internet Explorer和Firefox 3.5终于给我一个警告消息时,我只是增加了一个点。

因此,这使我怀疑,这到底是怎么回事呢? 为什么会与互联网的主机名,而不是用普通本地主机下旬脚本代码生成的工作? 或者是,正确的问题?

显然,这是出于安全原因实施,但什么是他们试图保护? 此外,通过得到它以点工作,我刚暴露出的安全保护功能安全漏洞?

顺便说一句,我的hosts文件,而改变对其他主机,有没有什么特别的本地主机与回事; 默认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);
    }
}

Answer 1:

我要抛出一个答案在那里; 经过一番思考,我达到了我自己的结论。

这可能是因为这就是会实现的,试图从调用客户端机器上运行的JSONP服务挫败的互联网网站安全功能。

网站可能只是经过端口的列表,并保持在不同的端口和路径调用本地主机。 “localhost”的是一些DNS主机名是在意义上动视的时候,它的查询,其中上,使得潜在弱势目标之一。 是的,这追加一个点(。),以“本地主机”(“本地主机”。)产生一个工作解决办法的事实确实暴露出安全漏洞,但确实提供了一个[临时]变通办法发展puposes。

更好的办法是到环回IP映射到主机文件中的新主机名项,以便在本地工作,不容易通过浏览器更新到被“固定”,并不起作用其他地方,但在开发工作站上。



Answer 2:

我遇到了类似的问题。 大多数我试过用IE(7)工作的解决方案,但我没法把火狐(3.5.2)打球。

我为了看我如何服务器的响应被解释在客户机上安装的是HttpFox,和我越来越NS_ERROR_DOM_BAD_URI。 我的情况是你有一点不同,虽然,因为我尝试调用JSONP回调托管页面来自同一个站点,然后这个调用响应以302重定向到另一个站点。 (我使用重定向作为一种方便的方式来获得返回给浏览器两个域的Cookie。)

我使用jQuery,和我最初试图通过$阿贾克斯()做一个标准的AJAX调用。 我想,作为初始请求是在同一站点托管页面,火狐将只按照302响应到另一个域。 但是,没有,它似乎下降XSS防御犯规。 (请注意,相反的是返回重定向作为响应XHR请求意味着,jQuery也遵循302重定向一个标准的dataType =“json的”电话:重定向到同一个域正常工作;重定向到另一个域在浏览器中生成NS_ERROR_DOM_BAD_URI 。)顺便说一句,我不明白为什么同域302重定向到其他领域不能只遵守 - 毕竟,它是在发出重定向托管页面的域名,那么为什么不能被信任? 如果你担心脚本注入攻击,那么JSONP途径是开放的滥用呢?

jQuery的$ .getJSON()用?回调=? 后缀也无法在Firefox中使用了同样的错误。 由于使用$ .getScript做()推出自己的JSONP <script>标记。

什么确实出现了工作,是具有预先存在的<脚本ID = “JSONP” 类型= “文本/ JavaScript的”>在HTML </ SCRIPT>然后使用$( “JSONP”)。ATTR( “SRC”,网址+ “?回调= myCallBack函数”)来调用JSONP调用。 如果我这样做,那么跨域302重定向之后,我让我的JSON响应传递给myCallBack函数(我已经在同一时间,在<script />标签中定义)。

而且,是的,我正在开发这一切卡西尼使用以localhost: 端口的URL。 卡西尼号将不会对非本地主机的网址回应,所以我不能轻易尝试local.mysite.com,看看是否有我上面试过的解决方案有任何影响。 然而,在本地主机的粘底点似乎有固定的我的所有问题!

现在,我可以回去标准$阿贾克斯({...数据类型:“JSONP” ...})与本地主机调用__.__: 端口 ,而不是本地主机: 端口 ,一切都很好。 我觉得有趣的是修改预先存在,在页面的HTML 确实让普通本地主机的URL时要调用的脚本标签的src属性-我想下你的思维过程,这可能是另一个安全漏洞。



文章来源: JSONP callback doesn't execute when running at localhost