基本上,我一直拉着我的头发试图测试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映射到主机文件中的新主机名条目,以使其在本地工作,不容易被浏览器更新“固定”,并且在其他任何地方都不起作用,而是在开发工作站上.