在使用web应用中,安全性是应该首要考虑的一个问题。AngularJS提供了一些辅助机制,用来防护来自两个常见攻击方向的网络攻击。
一.JSON漏洞
当使用一个GET请求获取JSON数组信息的时候(尤其是当这一信息非常敏感,并且需要登录或者授权才能访问时),存在一个很微妙的漏洞。
这个漏洞的形式为:恶意站点使用<SCRIPT>标签提交一个请求来获取同样的数组信息,由于你仍然处于登录状态,所以恶意站点就可以利用你的登录凭证来请求JSON信息,进而获取它。
你可能想知道这是怎么做到的,因为数组信息依然存在于你的客户端中,而服务器无法获得这一信息的引用。通常来说,通过获取script资源来返回JSON对象的方式会导致一个错误,但是数组是个例外。
下面就是漏洞所利用的弱点:在JavaScript中,可以重写或者重新声明内置的对象。在这个漏洞中,数组的构造器被重新声明了,在新的声明中,恶意站点可以获得数据的引用,然后发送到它自已的服务器上。这一漏洞被称为“JSON数组攻击”,具体的成因有些复杂,不过此漏洞只会在特定浏览器的特定版本中存在,因此通常情况下可以忽略。
有两种方法可以避免这个漏洞:对于敏感信息,请确保每次都是在POST请求中返回JSON格式的响应,并且返回一个对象;或者使用非法的JSON表达式作为结果,然后再用一些客户端逻辑把它转换成真实的数据。
AngularJS允许你使用这两种方法中的任意一种来避免JSON漏洞。但是在你的应用中,建议选择用POST请求获取JSON信息的方式。
更进一步,你可以配置一下服务器,在所有JSON响应上加一个前缀:[")]}',\n"
这样,下面的这个普通的响应['one', 'two'],将会以以下形式返回:
)]}', ['one', 'two']
AngularJS将会自动删掉前缀,只对后面的JSON字符串进行处理。
二.XSRF
XSRF(Cross-Site Request Forget,跨站请求伪造)攻击通常具有以下特征。
1.它们涉及的站点是那些使用授权信息或者用户身份信息的站点。
2.它们利用了这样一个事实:对于存在这一漏洞的站点,用户会保持登录状态或者授权状态。
3.它们会伪造一些带有副作用的HTTP/XHR的请求(通常是有害的)。
请考虑下面这个XSRF攻击的例子。
1.用户A登录到了他的银行账户(http://www.examplebank.com)。
2.用户B发现了这一点,然后让用户A访问自已的主页。
3.用户B的主页上有一个精心制作的图片链接,用来发起XSRF攻击:
<img src="http://www.examplebank.com/xfer?from=UserA&amount=10000&to=UserB">
如果用户A的银行把授权信息保存在cookie中,并且没有过期,那么当用户A打开用户B的网站时,就会触发一个从用户A到用户B的汇款操作,而这一操作根本没有获得授权。
那么AngularJS是如何帮助避免这一点的呢?它提供了一个“两步”机制来避免XSRF漏洞。
当客户端进行XHR请求时,$http服务会从cookie里读取一个叫做XSRF-TOKEN(这是一种令牌机制,需要服务端配合)的标记,然后把它设置成一个HTTP头X-XSRF-TOKEN。因为只有来自你自已的域的请求才能读取和设置这个标志,所以可以保证这个XHR来自你自已的域。
要运用这一机制还需要稍微改动一下你的服务端代码,让它在第一次接受HTTP GET请求时设置一个名为XSRF-TOKEN的可读session cookie。后续发送到服务端的请求可以在HTTP头中验证这个值,从而与第一次请求中的XSRF标记进行匹配。当然,对于每个用户来说这个令牌必须是唯一的,而且服务器必须验证这个值(应该避免使用JavaScript代码生成令牌)。
文章来源:《用AngularJS开发下一代Web应用》