`
windforce
  • 浏览: 80320 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Cross Site AJAX [转载]

阅读更多

一般情形下,为安全起见,浏览器不允许你在客户端通过XMLHttpRequest访问别的域(参考连接1,2),即使是同一域的子域也不行,譬如www.joycode.com 到 blog.joycode.com。(你可以通过某些设置来访问子域,但因为这方法不是很通行,所有就不考虑了,但如果你感兴趣,参考连接2。)

但很明显,在不少情形下,访问别的网站,获取别的网站的信息/服务是非常有用的,特别是在这个Web 2.0时代。

常用的跨站访问的方法有3种(参考连接3,4):

  1. 在同一域的服务器端建立一个代理,浏览器向该代理网址发送请求,然后该代理向其他域的网址发请求,在获取回复后,或作处理或按原样发回到浏览器
  2. 使用按需(On-Demand) Javascript 脚本。在页面内动态生成新的<script>,将其src属性指向别的网站的网址,这个网址返回的内容必须是合法的Javascript脚本,常用的是JSON消息。
  3. 使用IFRAME。在页面内嵌或动态生成指向别的网站的IFRAME,然后这2个网页间可以通过改变对方的anchor hash fragment来传输消息。改变一个网页的anchor hash fragment并不会使浏览器重新装载网页,所以一个网页的状态得以保持,而网页本身则可以通过一个计时器(timer)来察觉自己anchor hash的变化,从而相应改变自己的状态(参考这个帖子中提及的Nikhil Kothari的历史控件中的方法)。 Julien Couvreur在他的《Cross-document messaging hack》里描述了一个更复杂的应用情形,
    "....
    For example, if you have page A containing an iframe B in a different domain,then B can create a new iframe and load it with a url in the same domain as A. The url that is loaded doesn't generate a request to the server if it is properly cached and only the fragment identifier is used to pass changing information. Page A can now get the DOM handle on the new iframe and successfully retrieve the information transmitted in the url by B...." (大体这样,网页A包含了一个IFRAME B,B的网页来自一个不同的域。然后B页可以生成一个IFRAME C,把它指向与网页A同域的某个地址,因为是A与C同域,网页A可以访问C里的信息,反之亦然。)

ASP.NET AJAX扩展(即Atlas)提供了一个桥(bridge)机制让你在服务器端配置来访问别的网站,并同时支持POX和SOAP这2种协议。想了解其中细节,请参考Atlas文档里的《Building Mash-ups with "Atlas"》。当然你完全可以自己建立一个web service,通过它来访问其他网站并返回信息。

据说,Atlas中的 IFrameExecutor 可以实现跨域的调用,我按照MSDN博客Federal Developer Weblog的这篇帖子《Calling web services hosted outside of your application with “Atlas”》上的步骤试了一下,但在Windows 2003 Server SP1上得到却是“Access is denied”的错误信息。然后我下载了该文中的项目,试验的结果仍旧是“Access is denied”。也许需要改动一些浏览器中的什么设置才能成功,但这不是我的目的,我需要一个在普通设置下都能成功的例子。

按需(On-Demand) Javascript脚本的实现是很简单的,譬如我有这样一个网页,(想测试的话,需要改动其中的网址)

<html>
<head>
<script language="javascript" type="text/javascript">
function loadContent()
{
var s=document.createElement('SCRIPT');
s.src='http://www.anotherdomain.com/TestCrossJS.aspx?f=setDivContent';
document.body.appendChild(s);
}

function setDivContent(v)
{
var dv = document.getElementById("dv");
dv.innerHTML = v;
}
</script>
</head>
<body>
<div id="dv"></div>

<input type="button" value="Click Me" onclick="loadContent()">
</body>
</html>

其中的www.anotherdomain.com/TestCrossJS.aspx是这样的,

<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
  string f = Request.QueryString["f"];
  Response.Clear();
  Response.ContentType = "application/x-javascript";
  Response.Write(String.Format(@"
                   {0}('{1}');", 
                   f,
                   DateTime.Now));
  Response.End();
}
</script>

点击“Click Me”按钮,生成一个新的script tag,下载对应的 Javascript 脚本,结束时回调其中的setDivContent(),从而更新网页上一个div的内容。

IFRAME的方法好像很流行,除了dojo工具包支持外,据微软的Dare Obasanjo说(参考连接9),Windows Live Contacts Gadget使用了这个方法来获取Hotmail的address book。最近,Plaxo公司的开发人员 Joseph Smarr在七月的OSCON 2006会议上作了一个题为《Cross-site Ajax: Challenges and Techniques for Building Rich Web 2.0 Mashups》的讲座[来源:Kevin Yank--OSCON 2006: Cross-site Ajax],他们将这个方法做成了一个平台,允许合作伙伴间合作,他们开发的方案叫“The JavaScript Wormhole(虫洞)”,据说准备将其推广为一个标准。他讲座的PPT可以在这里下载,里面对这个方案做了说明,非常值得看一下。

现在将IFRAME的方法简单示范如下:

1. http://domain1/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain2/TestCross.html"
var oldHash = null;
var timer = null;

function getHash()
{
var hash = window.location.hash;
if ((hash.length >= 1) && (hash.charAt(0) == '#'))
{
hash = hash.substring(1);
}

return hash;
}
function sendRequest()
{
var d = document;
var t = d.getElementById('request');
var f = d.getElementById('alienFrame');
f.src = url + "#" + t.value + "<br/>" + new Date();
}

function setDivHtml(v)
{
var d = document;
var dv = d.getElementById('response');
dv.innerHTML = v;
}

function idle()
{
var newHash = getHash();

if (newHash != oldHash)
{
setDivHtml(newHash);
oldHash = newHash;
}

timer = window.setTimeout(idle, 100);
}

function window.onload()
{
timer = window.setTimeout(idle, 100);
}
</script>
</head>
<body>

请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/>
回复:<div id="response"></div>

<iframe id="alienFrame" src="http://domain2/TestCross.html"></iframe>

</body>
</html>

2. http://domain2/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain1/TestCross.html"
var oldHash = null;
var timer = null;

function getHash()
{
var hash = window.location.hash;
if ((hash.length >= 1) && (hash.charAt(0) == '#'))
{
hash = hash.substring(1);
}

return hash;
}
function sendRequest()
{
var d = document;
var t = d.getElementById('request');
var f = parent;
//alert(f.document); //试着去掉这个注释,你会得到“Access is denied”
f.location.href = url + "#" + t.value + "<br/>" + new Date();
}

function setDivHtml(v)
{
var d = document;
var dv = d.getElementById('response');
dv.innerHTML = v;
}

function idle()
{
var newHash = getHash();

if (newHash != oldHash)
{
setDivHtml(newHash);
oldHash = newHash;
}

timer = window.setTimeout(idle, 100);
}

function window.onload()
{
timer = window.setTimeout(idle, 100);
}
</script>
</head>
<body>

请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/>
回复:<div id="response"></div>

</body>
</html>

两个网页基本相同,第一个网页内嵌一个IFRAME,在点击“发送”按钮后,会将文本框里的内容通过hash fragment传给IFRAME。点击IFRAME里的“发送”按钮后,它会将文本框里的内容通过hash fragment传给父窗口。因为是只改动了hash fragment,浏览器不会重新load网页内容,这里使用了一个计时器来检测URL变化,如果变化了,就更新其中一个div的内容 。

这个方法是不是个安全漏洞?考虑到微软的Windows Live都在使用这个方法,估计不是,。这个方法是不是很安全?考虑到这个方法只有在2个网站协作的情形才能成功,安全问题好像不是很大,除非其中涉及的网站本身有XSS的问题。

【参考连接】

1. Security Considerations: Dynamic HTML
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/sec_dhtml.asp

2. About Cross-Frame Scripting and Security
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om/xframe_scripting_security.asp

3. Cross-Domain Proxy
http://ajaxpatterns.org/Cross-Domain_Proxy

4. Cross Domain XMLHttpRequest using an IFrame Proxy
http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book75

5. Back Button Support for Atlas UpdatePanels
http://www.nikhilk.net/BackButtonSupport.aspx

6. Cross-document messaging hack
http://blog.monstuff.com/archives/000304.html

7. Building Mash-ups with "Atlas"
http://atlas.asp.net/docs/Walkthroughs/DevScenarios/bridge.aspx

8. Calling web services hosted outside of your application with “Atlas”
http://blogs.msdn.com/federaldev/archive/2006/07/31/684229.aspx

http://www.federaldeveloper.com/Shared%20Documents/Presentations%20by%20Marc%20Schweigert/CallAtlasWebServiceInDifferentProject.zip

9. AJAX Tip: Passing Messages Between iframes
http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=3b03cf9d-b589-4838-806e-64efcc0a1a15

10. OSCON Cross-site Ajax Slides
http://blog.plaxo.com/archives/2006/07/oscon_crosssite.html

http://www.plaxo.com/css/api/Joseph-Smarr-Plaxo-OSCON-2006.ppt

11. OSCON 2006: Cross-site Ajax
http://www.sitepoint.com/blogs/2006/07/28/oscon-2006-cross-site-ajax/



风之力 2006-10-16 16:38 发表评论
分享到:
评论

相关推荐

    AJAX实战中文版

    除此之外,书中还会涵盖AJAX的安全性问题,如跨域请求的CORS(Cross-Origin Resource Sharing)策略,以及如何防止XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)等攻击。这些知识对于开发安全的...

    初学ajax 有关于ajax的学习

    - **防止XSS(Cross-Site Scripting)**:对用户输入进行验证和过滤,避免恶意代码注入。 - **防止CSRF(Cross-Site Request Forgery)**:使用令牌或验证头来确认请求来源。 - **缓存利用**:通过设置HTTP头来控制...

    ajax实战中文版pdf

    此外,还涉及到了Ajax的安全性问题,如XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击的预防措施,提醒开发者在实现功能的同时,必须考虑应用的安全性。 总的来说,**Ajax实战中文版**是...

    Ajax小例子源码

    8. **安全性**:虽然Ajax提高了用户体验,但也带来了一些安全问题,如XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)。开发者需要了解并采取措施防止这些攻击,例如验证请求来源、使用令牌等。 ...

    用AJax框架做的小项目

    - **安全考虑**:了解防止XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击的方法。 通过以上步骤,初学者可以逐步掌握Ajax框架的使用,并能运用到实际的小项目中。不断实践和探索,将有助于...

    使用Ajax和Web Service重构网上书店(Ajax Web Service)指导学习

    9. **安全考虑**:在使用Ajax和Web Service时,要关注数据安全、用户认证和授权,防止XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击。 10. **前端框架**:现代前端框架如jQuery、AngularJS...

    Pro Ajax and Java Frameworks.pdf

    作者讲解了如何防范常见的安全威胁,如XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击,并讨论了处理跨域资源共享(CORS)的方法,确保Ajax应用能够在不同域名间安全地交换数据。 6. **案例...

    ajax输入框提示集合

    9. **安全性**:处理用户输入时,需要防范XSS(Cross-Site Scripting)等安全风险,确保数据安全传输。 总的来说,这个压缩包可能是一个Ajax搜索框实现的集合,包含了一系列源码示例,可以帮助开发者学习和理解如何...

    ajax无刷新分页

    - **安全性**:处理好跨域问题,防止XSS(Cross-site scripting)和CSRF(Cross-site request forgery)攻击。 总结,Ajax无刷新分页是现代Web开发中的一个重要技术,它提升了用户体验,使得用户在浏览大量数据时...

    AJAX技术

    - **XSS(Cross-Site Scripting)**:AJAX可能导致XSS攻击,需对用户输入进行过滤和转义。 - **CSRF(Cross-Site Request Forgery)**:防止恶意第三方发起伪造的AJAX请求。 总之,AJAX是现代Web开发中的一个重要...

    AJAX权威指南

    AJAX应用也需关注安全问题,例如防止XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击,确保数据传输的安全性,以及处理好用户隐私数据。 ### 9. 适应性设计 随着移动设备的普及,响应式设计...

    ajax技术简介

    12. **安全性**:使用Ajax技术时,需要注意XSS(Cross-site scripting)和CSRF(Cross-site request forgery)等安全风险,合理的验证和授权机制是必要的。 综上所述,Ajax技术是构建动态、交互性强的Web应用的重要...

    Ajax异步请求

    但是,需要注意异步请求的限制和安全问题,例如,避免cross-site scripting(XSS)攻击和跨域请求问题。 Ajax异步请求的优点包括: * 提高用户体验和页面加载速度 * 实现异步通信,提高应用程序的响应速度 * 减少...

    ajax开发夹包

    7. **安全考虑**:在使用Ajax时,应考虑安全性问题,比如防止XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击。使用HTTPS协议可以增强通信的安全性。 8. **库和框架的支持**:现代前端开发中...

    传智播客ajax源码

    1. 防止XSS(Cross-Site Scripting)攻击:正确处理用户输入,避免注入。 2. 防止CSRF(Cross-Site Request Forgery):使用令牌验证请求来源。 通过学习和实践这些源代码,你可以深入了解Ajax的工作机制,提升Web...

    疯狂Ajax讲义(第3版) 源代码 完整版(1-12章)

    9. **安全考虑**:Ajax应用同样面临安全问题,如XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击,开发者需要采取相应的防护措施。 10. **响应式设计**:随着移动设备的普及,Ajax需要结合...

    Ajax征服——Ajax小偷模块 源码

    8. **安全考虑**:使用Ajax时,需要考虑到XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)等安全问题,确保数据传输的安全性。 9. **状态管理**:在处理多个并发的Ajax请求时,良好的状态管理至...

    JAVA AJAX框架 DWR

    DWR提供了安全机制,如CSP(Cross Site Scripting Prevention)和CSRF(Cross Site Request Forgery)防护,以防止恶意攻击。此外,通过设置白名单和黑名单,可以控制哪些JavaScript可以访问哪些Java方法。 **DWR与...

    Ajax跨域提交

    在进行Ajax跨域提交时,需要注意处理可能出现的安全问题,比如XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击,同时确保用户数据的安全。 在实际开发中,开发者还需要考虑到浏览器兼容性,因为...

    AJAX实现无刷新用户注册

    9. **安全考虑**:为了防止XSS(Cross-Site Scripting)和CSRF(Cross-Site Request Forgery)攻击,需要在AJAX请求中添加合适的验证令牌。 10. **Promise和async/await**:现代JavaScript提供了Promise和async/...

Global site tag (gtag.js) - Google Analytics