本节书摘来自异步社区《第三方JavaScript编程》一书中的第7章,第7.1节,作者:[美] Ben Vinegar Anton Kovalyov著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第7章 安全性
本章包括
- 跨站脚本攻击(XSS)
- 跨站请求伪造(XSRF)
- 发布者模拟,点击劫持和拒绝服务
在前面章节中,你已经学到了如何创建一个实用且可配置的第三方应用程序,以及如何同服务端通信,如何验证用户是否能够使用受限或部分受限的功能,本章介绍第三方JavaScript应用所涉及的另外一个重要话题:应用的安全性。
最初,网络非常简单,只是一个相互关联的网站系统。这些网站通常都是普通的文档,并且多数是静态页面。Web服务器的工作就是从文件系统中检索文件,并将其发送到浏览器。在该过程中,工作在客户端的浏览器接收到文档后为用户显示。很少有网站对它们的用户进行身份验证,因为最初设计的网络是一个开放的系统,用于超文本文件的共享。这个阶段的安全威胁通常与服务端的漏洞有关,这也是攻击者的首要目标。
而如今的网络截然不同。不仅有复杂的应用,从我们喜欢的新闻阅读到我们个人的健康记录,这些应用几乎涵盖了一切,还有内嵌在其他Web容器内的应用,或者说是第三方JavaScript应用(本书的主题)。因为现代Web应用有对敏感数据的处理,因此网络不再是文档共享时那样的开放系统,这一变化同样改变了安全领域。针对浏览器有了新的安全威胁,比如恶意攻击者可以盗取用户的个人信息,进行金融诈骗,也可以执行未经授权的操作,从而威胁到你的应用。
当提到第三方应用的安全性时,每个人的风险都很大。用户信任你使用他们的数据,发布者允许你访问他们的Web页面并且希望你能合理的使用,同时你获得的这些信任都存在有很大风险。无论你的第三方应用有多好,只要它可能威胁到财产安全,就没有网站会安装它们,因此信任起着至关重要的作用。
在本章中,我们会介绍第三方JavaScript应用最为关注的安全漏洞,并介绍如何防止这些漏洞。首先我们会对会话和cookie进行快速回顾,因为你很快会了解到,这些是许多Web攻击的首要目标。接着我们会深入了解两个主要的安全漏洞:跨站脚本攻击(Cross-site Scripting,XSS)和跨站请求伪造(Cross-site Request Forgery,XSRF)。最后,我们将介绍如何解决这两个安全问题。
7.1 Cookie,会话和会话窃取
在深入了解这些事情之前,让我们快速回顾一下cookie在Web应用中的作用。也许你还记得,cookie是浏览器在HTTP请求中发送的一个数据片段。这是在原本无状态的协议(HTTP)中保存状态的一种简单方式。
Web服务器通过在HTTP响应中返回Set-Cookie头来设置cookie。cookie的内容可以是任意不含空格的字符串,但它通常是一组键值对。下述HTTP响应示例中,演示了如何设置一个名为sessionid的cookie。
在Web应用中cookies的一个典型应用场景就是保持用户会话。在这种情况下,用户登录后,服务端会生成一个令牌,唯一标识当前用户同服务端的会话,并将其作为cookie存储在浏览器中。后续用户向服务器发起任何请求时,浏览器都会将存储sessionid的cookie值作为HTTP的Cookie请求头,自动发送到服务端。
当服务器接收到包含该cookie的请求时,会在本地查找同传递的会话令牌相匹配的用户记录。如果查找到对应的用户,服务器便会将该用户作为请求方,并返回相应的内容,直至cookie过期或者被删除(用户自己删除或者通过服务端设置的Set-Cookie头删除)。
浏览器会话的主要问题在于,它们只是通过cookie中的一个会话令牌值来表示对应的会话。一旦攻击者获取到会话令牌的值,便可以很容易的以该用户的身份通过当前Web服务的验证。然后,攻击者便可以用该用户的身份执行任意操作,比如访问或者获取他们的私人数据。显然,这种场景是灾难性的,但是如果不是物理窃取了用户的计算机,攻击者如何才能获取到用户的cookie呢?
在第6章中,介绍了cookie被攻击者窃取或者劫持的一种情况:使用中间人攻击(MITM)。这种攻击利用了普通HTTP请求通过纯文本传输数据的特性,因此很容易通过包嗅探获取cookie。这就意味着在未加密的网络(比如附近的咖啡馆的免费Wi-Fi网络)中,恶意的攻击者可以通过扫描网络流量找到包含会话cookie的HTTP请求并复制它们。
在第6章中,也介绍了防御MITM攻击最好的方式就是使用安全的HTTP(HTTPS)对所有服务端和浏览器之间的HTTP请求进行加密。因为HTTP请求加密后,就不再受包嗅探的威胁,从而防止了中间人攻击[1]。
尽管HTTPS令人振奋,而且能够有效防御MITM攻击,但并不是解决所有Web应用安全威胁的万能钥匙。MITM只是攻击者获取用户cookie的一种方式。不幸的是,在达到安全验收标准之前,你的Web应用还有其他漏洞需要处理。但不用先急着解决,我们会深入了解这些漏洞,并提出相应的解决方案和防御技术。
在开始之前,我们先来深入了解JavaScript应用中最常见的安全漏洞:跨站脚本。