谈AJAX的安全性及AJAX安全隐患
来源:网络 更新时间:2014-12-2
Web开发者不会注意到由“AJAX(AsynchronousJavaScriptAndXML)”所带来的激情。不费力气就能创建像GoogleSuggest那样的智能网站或者像Gmail那样基于Web的应用程序,这在很大程度上要归功于这种技术。然而,伴随着AJAX应用程序的发展,我们发现了它的一些不足之处,我们发现它的安全漏洞也在逐渐变大,就像慢慢地把基于AJAX的站点放入了一颗定时炸弹中。
AJAX的好处
在当年“Web应用程序”的美好时代,事情非常简单。你填写了一个表单,点击“提交”按钮,然后当前屏幕就消失了,等待一小会儿后你就转入到了下一个页面。今天的状况已经不是这样的了,用户需要的是一种就像任何桌面应用程序那样流畅、快捷和人性化的Web体验。
AJAX经常是和DHTML(DynamicHTML)一起协作的,它的顺利执行需要允许网页中的JavaScript代码和web服务器在后台无缝通讯。比方说,当你开始在GoogleSuggest的搜索框中输入东西时,web页面就和服务器在后台开始交换数据,然后会给出一些你可能需要的词条等。所有的这一切都不需要页面刷新或者按下任何按钮。同样这也就是像Gmail那样的应用程序怎么能对实时拼写检查做的那么好的原因。
AJAX怎样工作
AJAX复杂的原理已经超出了今天所要阐述的范围,这里只简单描述一下。你的页面上的JavaScript代码能够在不依赖于用户的情况下和你的Web服务器取得联系。这里面起核心作用的就是JavaScript的XMLHttpRequest对象,这个对象能够被就像用户敲击键盘或者时钟事件在后台或者异步触发(也就是术语异步JavaScript和XML)。
如果你在GoogleSuggest中输入“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代码本身也能够被取回和评估。继续完成我的输入“ajaxexample”,将会从Google的服务器产生下面的回应:
sendRPCDone(frameElement,"ajaxexample",newArray("ajaxexample","ajaxexamples"),newArray("153,000results","177,000results"),newArray(""));
这将会给你一些关于强大的AJAX的暗示吧,它具有在运行中(onthefly)把新的JavaScript代码加入到浏览器中的能力。然而,最优化的方法看起来好像束缚了XML协定。举个例子说明一下,比如Google产生了下面的这个东西:
ajaxexample
153,000
ajaxexamples
177,000
显然,你可以在一个合适的表单中解释这些XML数据,但我们要感谢JavaScript,它确实能够在一些非常典型的限制条件下和大量讨厌的IEbug环境里非常好的处理XML对象。
为了帮助你理解一些Ajax的问题,我在这里给你介绍一个假想的旅行公司-“时代尖端旅行公司”。由于受到AJAXbug的推动,他们的主要web开发者MaxUptime为了创建一个这样的应用程序,他决定混合使用AJAX,这样,他走在时代尖端了。
AJAX的问题
半数以上的AJAX安全风险来自隐含在服务器中的漏洞。显然,使用安全编码技术的好的设计,对于更安全的AJAX大有帮助,我们需要感谢Max熟悉开放万维网应用安全计划(theOpenWebApplicationSecurityProject-OWASP)排名前十的最严重web应用程序安全漏洞列表(www.owasp.org)。不幸的是,当Max实现AJAX的时候,他仍然需要面对许多额外的因素:
1.新的技术:如果Max想把他的站点连接到一个SQL数据库,他在Google查到了数百万的例子。AJAX技术,不管这种技术有多年轻,它仍然是出现在采购循环中相对较早的,尽管它只有很少一部分好的例子出现在网络上。为了解决一些难处理的和不必要的复杂问题,这就要求像Max那样的开发者去自主开发。Max也就不得不编写服务器端和客户端的代码,创建他自己不太确定的协议(特别是对服务器响应来讲)。不管这些协议有多好,都将会及时表现在页面上。