javascript – 在localhost运行时,JSONP回调不会执行

前端之家收集整理的这篇文章主要介绍了javascript – 在localhost运行时,JSONP回调不会执行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是奇怪的,我想知道是否有人可以清楚了解为什么会发生这种情况.

基本上,我一直拉着我的头发试图测试JSONP,所以我可以实现其他网站可以使用的JSON网络服务.我正在本地进行开发,特别是Visual Studio 2008和Visual Studio 2008的内置Web服务器.

所以作为一个JSONP测试运行w / 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以及Firefox 3.5中进行了测试.没有人会调用回调.捕获(错误)也没有达到.什么都没发生!

我一直坚持一个星期,甚至在指定端口的Telnet中使用手动键入的HTTP请求进行测试,以确保服务器正在返回格式…

callbackfn({abc : 'def'})

..它是.

然后它出现在我身上,如果我使用全局变量(‘.’)将主机名从localhost更改为localhost,即http://localhost.:41559/而不是http://localhost:41559/(是的,向任何主机名添加一个点是合法的,那就是DNS什么全局::是C#命名空间).然后它工作! Internet Explorer和Firefox 3.5终于在我添加了一个点时向我显示了一个提醒信息.

所以这让我很奇怪,这里发生了什么?为什么后期脚本代码生成工作与Internet主机名而不是普通的本地主机?还是正确的问题?

显然这是出于安全原因而实施的,但是他们试图保护什么?而且,通过让它与一个点一起工作,我是否在这个安全功能中暴露了一个安全漏洞?

顺便说一下,我的主机文件虽然被其他主机修改,但对localhost没有什么特别的影响;默认的127.0.0.1 / :: 1仍然存在,下面没有覆盖.

后续行动:我已经通过以下方式加入:

127.0.0.1   local.mysite.com

..到我的主机文件,然后添加以下代码到我的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);
    }
}

解决方法

我要在那里扔一个答案经过一番思考,我已经得出了我自己的结论.

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

网站可以通过端口列表,并在不同的端口和路径上继续调用localhost. “本地主机”是少数DNS主机名之一,具有动态意义,取决于查询的时间和地点,使潜在的目标变得脆弱.是的,在“localhost”(‘localhost.)’上附加一个点(.)的事实产生了一个工作的解决方法,但是会暴露出一个安全漏洞,但是为开发人员提供了一个[暂时的]解决方法.

更好的方法是将环回IP映射到主机文件中的新主机名条目,以使其在本地工作,不容易被浏览器更新“固定”,并且在其他任何地方都不起作用,而是在开发工作站上.

猜你在找的JavaScript相关文章