天天看点

《第三方JavaScript编程》——第7章 安全性 7.1Cookie,会话和会话窃取

本节书摘来自异步社区《第三方javascript编程》一书中的第7章,第7.1节,作者:[美] ben vinegar anton kovalyov著,更多章节内容可以访问云栖社区“异步社区”公众号查看

本章包括

跨站脚本攻击(xss)

跨站请求伪造(xsrf)

发布者模拟,点击劫持和拒绝服务

在前面章节中,你已经学到了如何创建一个实用且可配置的第三方应用程序,以及如何同服务端通信,如何验证用户是否能够使用受限或部分受限的功能,本章介绍第三方javascript应用所涉及的另外一个重要话题:应用的安全性。

最初,网络非常简单,只是一个相互关联的网站系统。这些网站通常都是普通的文档,并且多数是静态页面。web服务器的工作就是从文件系统中检索文件,并将其发送到浏览器。在该过程中,工作在客户端的浏览器接收到文档后为用户显示。很少有网站对它们的用户进行身份验证,因为最初设计的网络是一个开放的系统,用于超文本文件的共享。这个阶段的安全威胁通常与服务端的漏洞有关,这也是攻击者的首要目标。

而如今的网络截然不同。不仅有复杂的应用,从我们喜欢的新闻阅读到我们个人的健康记录,这些应用几乎涵盖了一切,还有内嵌在其他web容器内的应用,或者说是第三方javascript应用(本书的主题)。因为现代web应用有对敏感数据的处理,因此网络不再是文档共享时那样的开放系统,这一变化同样改变了安全领域。针对浏览器有了新的安全威胁,比如恶意攻击者可以盗取用户的个人信息,进行金融诈骗,也可以执行未经授权的操作,从而威胁到你的应用。

当提到第三方应用的安全性时,每个人的风险都很大。用户信任你使用他们的数据,发布者允许你访问他们的web页面并且希望你能合理的使用,同时你获得的这些信任都存在有很大风险。无论你的第三方应用有多好,只要它可能威胁到财产安全,就没有网站会安装它们,因此信任起着至关重要的作用。

在本章中,我们会介绍第三方javascript应用最为关注的安全漏洞,并介绍如何防止这些漏洞。首先我们会对会话和cookie进行快速回顾,因为你很快会了解到,这些是许多web攻击的首要目标。接着我们会深入了解两个主要的安全漏洞:跨站脚本攻击(cross-site scripting,xss)和跨站请求伪造(cross-site request forgery,xsrf)。最后,我们将介绍如何解决这两个安全问题。

在深入了解这些事情之前,让我们快速回顾一下cookie在web应用中的作用。也许你还记得,cookie是浏览器在http请求中发送的一个数据片段。这是在原本无状态的协议(http)中保存状态的一种简单方式。

web服务器通过在http响应中返回set-cookie头来设置cookie。cookie的内容可以是任意不含空格的字符串,但它通常是一组键值对。下述http响应示例中,演示了如何设置一个名为sessionid的cookie。

《第三方JavaScript编程》——第7章 安全性 7.1Cookie,会话和会话窃取

在web应用中cookies的一个典型应用场景就是保持用户会话。在这种情况下,用户登录后,服务端会生成一个令牌,唯一标识当前用户同服务端的会话,并将其作为cookie存储在浏览器中。后续用户向服务器发起任何请求时,浏览器都会将存储sessionid的cookie值作为http的cookie请求头,自动发送到服务端。

《第三方JavaScript编程》——第7章 安全性 7.1Cookie,会话和会话窃取

当服务器接收到包含该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应用中最常见的安全漏洞:跨站脚本。

继续阅读