开发者的Web安全戒律:真实威胁与防御实践
上QQ阅读APP看书,第一时间看更新

前言

互联网是一个“疯狂”的地方。人们很容易有这样的印象——互联网是由网络专家精心设计的,并且一切都做得很好。实际上,互联网的发展是迅速而随意的,我们今天在互联网上所做的事情远远超出了互联网发明者的想象。

正因如此,保护互联网安全是一项艰巨的任务。网站是一种独特的软件形式,它发布后立即为数百万用户所使用,其中包括活跃而积极的黑客社区。大公司通常会遇到安全问题,几乎每周都会公布新的数据泄露事件。面对这种情况,无助的Web开发人员应该如何保护自己呢?

关于本书

Web安全的一个大秘密是——Web漏洞的数量实际上很少(巧合的是,它们可以容纳在一本书中),并且这些漏洞每年变化不大。本书将告诉你需要了解的每一个关键威胁,并且分解保护网站所需要采取的实际步骤。

这本书适合谁

如果你是刚开始进行Web开发,那么这本书将是你的理想指南。无论你是刚刚从计算机科学专业毕业,还是自学成才的新手,我都建议你仔细阅读本书。本书中的所有内容都是必不可少的,并且通过最清晰的示例以最直接的方式进行了解释。现在就为即将面临的威胁做好充分的准备,这将会为你省去很多麻烦。

如果你是一位有经验的程序员,本书对你来说也是有用的。通过学习安全知识,你始终可以从中受益,因此,尝试使用本书来填补你可能遇到的空白。把它当作一本参考书,并深入阅读你感兴趣的章节。没有人能掌握所有的知识,经验丰富的程序员更有责任以身作则,领导好团队,对于Web开发人员来讲,这意味着需要遵循最佳安全实践。

你会注意到,本书并没有特定于某一种编程语言(尽管我会根据需要为主流语言提供各种安全建议)。无论你选择哪种编程语言,对Web安全的良好理解都将使你受益。许多程序员在他们的职业生涯中会使用多种语言,因此学习Web安全的原理比过于关注单个语言类库要更好。

互联网简史

在开始介绍本书的内容之前,回顾一下互联网如何发展到当前状态将非常有用。许多聪明的工程师为互联网的爆炸式增长做出了贡献,但是和大多数软件项目一样,在添加功能时,在安全方面的考虑往往不够。了解安全漏洞是如何产生的将为你提供修复它们所需的相关知识。

万维网(World Wide Web)是蒂姆·伯纳斯-李(Tim Berners-Lee)在欧洲核子研究中心(CERN)工作时发明的。在欧洲核子研究中心进行的研究包括将亚原子颗粒粉碎在一起,希望它们会分裂成更小的亚原子颗粒,从而揭示宇宙的基本结构,但这种研究可能会在地球上造成黑洞。

蒂姆·伯纳斯-李显然对实现宇宙终结不感兴趣,他在欧洲核子研究中心工作期间发明了我们今天所知的互联网——作为大学间共享研究结果的一种手段。他发明了第一个Web浏览器和第一个Web服务器,并发明了超文本标记语言(HTML)和超文本传输协议(HTTP)。世界上第一个网站于1993年上线。

早期的网页只支持文本格式。第一款能够显示嵌入图像的浏览器是美国国家超级计算应用中心(National Center for Supercomputing Applications)开发的Mosaic。Mosaic的开发者最终加入了Netscape Communications公司,帮助开发了Netscape Navigator,这是第一款广泛使用的Web浏览器。在早期的Web中,大多数页面都是静态的,传输流量没有加密。那是一个简朴的时代!

浏览器中的脚本

快进到1995年,Netscape Communications公司的Brendan Eich花10天时间发明了JavaScript,这是第一种能够嵌入网页的语言。在开发过程中,该语言被称为Mocha,然后重命名为LiveScript,然后再次重命名为JavaScript,最终被正式命名为ECMAScript。没有人喜欢ECMAScript这个名字,尤其是Eich,他声称这听起来像是一种皮肤病。因此,除了最正式的设置外,程序员都继续将其称为JavaScript。

JavaScript的原始版本结合了Java编程语言(因此名字中有Java)的笨拙命名约定、C语言的结构化编程语法、晦涩的基于原型的Self继承以及Eich自己设计的噩梦般的类型转换逻辑。不管是好是坏,JavaScript成了事实上的Web浏览器语言。突然间,网页实现了可交互,并且出现了一系列安全漏洞。黑客通过跨站点脚本(XSS)攻击找到了将JavaScript代码注入页面的方法,互联网变得更加危险。

新的挑战者入场

Netscape Navigator的第一个真正竞争对手是微软的Internet Explorer。Internet Explorer具有两个竞争优势——它是免费的,并且预先安装在微软的Windows系统上。Internet Explorer迅速成为世界上最受欢迎的浏览器,它的图标成为人们学习浏览网页的“互联网按钮”。

微软试图“拥有”网络,导致它向浏览器引入了ActiveX等专有技术。不幸的是,这导致感染用户计算机的病毒(恶意程序)激增。Windows是计算机病毒的主要攻击目标(现在仍然是),而互联网被证明是一种有效的传播途径。

Internet Explorer的主导地位在很多年内都没有受到挑战,直到Mozilla的Firefox发布,然后是Chrome,这是一款由新兴的搜索初创公司Google开发的浏览器。这些新的浏览器加速了互联网标准的发展和创新。然而到目前为止,黑客攻击已经成为一项有利可图的业务,安全漏洞一旦被发现就会迅速被利用。保护浏览器的安全成为厂商的首要任务,网站所有者如果想保护用户,就必须关注最新的安全公告。

编写HTML的机器

Web服务器的发展速度与浏览器技术的一样快。在互联网出现的最初几年,架设网站是学术界的一项小众爱好。大多数大学都使用开源操作系统Linux。1993年,Linux社区实现了公共网关接口(Common Gateway Interface,CGI),允许网站管理员轻松创建由相互链接的静态HTML页面组成的网站。

更有趣的是,CGI允许通过脚本语言(如Perl或PHP)生成HTML,因此网站所有者可以根据存储在数据库中的内容动态创建页面。PHP最初是指个人主页(Personal Home Page),当时的目的是让每个人都可以运行自己的Web服务器,而不是将所有个人信息上传给一个数据隐私政策有问题的社交媒体巨头。

PHP普及了模板文件的概念——带有嵌入式处理标签的HTML,这可以通过PHP运行时引擎来提供。动态PHP网站(例如Facebook的最早版本)在互联网上蓬勃发展。然而,动态服务器代码引入了一类全新的安全漏洞。黑客通过注入攻击在服务器上运行自己的恶意代码,或者通过目录遍历来探索服务器的文件系统。

一系列“管道”

网络技术的不断革新意味着当今的互联网大部分由我们认为的“旧”技术驱动。软件趋于达到足以发挥作用的程度,然后进入“维护”模式,只有在绝对必要时才进行更改。对于需要24×7全天候在线的Web服务器来说尤其如此。黑客会在互联网上扫描使用较旧技术的易受攻击的站点,因为这类站点经常会出现安全漏洞。我们仍在解决十年前首次发现的安全问题,这就是为什么我在本书中描述了可能影响网站的每个主要安全缺陷。

与此同时,互联网继续以前所未有的速度增长!汽车、门铃、冰箱、灯泡和猫砂托盘等日常设备的互联网化趋势为攻击打开了一个新的载体。连接到物联网的设备越简单,自动更新安全功能的可能性就越小。这引入了大量不安全的互联网节点,为僵尸网络提供了丰富的托管环境,恶意软件代理可以被黑客远程安装和控制。如果你的网站是攻击者的目标,这会给他们提供很大的潜在火力。

首先要担心什么

Web开发人员很容易因保护网站过程中所遇到的困难而产生挫败感。不过你应该抱有希望:一群安全研究人员正在勇敢地发现、记录和修复安全缺陷。确保你的网站安全的工具是随时可用和易用的。

了解最常见的安全漏洞,并知道它们是如何被利用的,将保护你的系统免受99%的攻击。总是会有一些技术水平极高的对手来攻击你的系统,但是除非你正在运行核反应堆项目,否则这种想法不应该让你夜不能寐。

本书内容

本书分为18章。其中第1~5章介绍互联网的工作原理等内容,第6~18章深入研究需要防御的特定漏洞。具体如下:

第1章:让我们了解黑客如何入侵一个网站

在本章,你将了解黑客入侵网站有多么容易。这是一件很可怕的事情,所以你买这本书就对了。

第2章:互联网的工作原理

互联网的“管道[1]”运行在互联网协议(Internet Protocol,IP)上,互联网协议是一系列网络技术,可以使世界各地的计算机无缝通信。我们将了解TCP、IP地址、域名和HTTP,并了解如何在网络上安全地传输数据。

第3章:浏览器的工作原理

用户通过浏览器与你的网站进行交互,那里可能有许多安全漏洞。你将学习浏览器如何呈现网页,以及如何在浏览器安全模型中执行JavaScript代码。

第4章:Web服务器的工作方式

你为网站编写的大多数代码都将在Web服务器环境中运行。Web服务器是黑客的主要目标。本章介绍它们如何提供静态内容,以及如何使用动态内容(如模板)合并来自数据库和其他系统的数据。你还将学习用于Web开发的一些主要编程语言,并回顾每种语言的安全性和注意事项。

第5章:程序员的工作方式

本章介绍如何编写网站代码并养成良好的习惯,以减少错误和安全漏洞带来的风险。

第6章:注入攻击

你将通过了解可能遇到的最讨厌的威胁之一——黑客注入代码并在你的服务器上执行代码——开始对网站漏洞的研究。当你的代码与SQL数据库或操作系统对接时,通常会发生这种情况,或者攻击可能包含注入Web服务器进程本身的远程代码。你还将看到黑客如何利用文件上传功能注入恶意脚本。

第7章:跨站点脚本攻击

在本章,你将了解用于将恶意JavaScript代码“走私”到浏览器环境中的攻击,以及如何防范这些攻击。跨站点脚本有三种不同的方法(存储型、反射型的和基于DOM),你将学习如何防范每种XSS类型攻击的方法。

第8章:跨站点请求伪造攻击

你将看到黑客如何使用伪造攻击来诱骗用户执行有害行为。这是互联网上的常见问题,你需要相应地保护你的用户。

第9章:破坏身份认证

如果用户注册了你的网站,那么你必须确保他们账户的安全性。你将了解黑客用来绕过登录的各种方法,从暴力破解密码到用户枚举。你还将了解如何在数据库中安全地存储用户账号和密码。

第10章:会话劫持

你将看到用户登录后黑客如何对他们的账户进行劫持,并将学习如何编译网站并安全地处理cookie以减轻这种风险。

第11章:权限

了解如何防止具有恶意的人使用提权来访问网站的禁止区域。特别是你在URL中引用文件时,黑客将尝试使用目录遍历来浏览文件系统。

第12章:信息泄露

网站泄露的信息可能会导致其他漏洞出现。本章将告诉你如何应对这种情况。

第13章:加密

本章介绍如何正确使用加密,并解释为什么加密在互联网上很重要。你需要具备一些简单的数学知识。

第14章:第三方代码

你将学习如何管理他人代码中的漏洞。你运行的大多数代码都将由其他人编写,并且你应该知道如何保护它!

第15章:XML攻击

你的Web服务器可能会解析XML,并且可能容易受到本章所述的各种攻击。在过去的几十年中,XML一直是黑客攻击中持续流行的攻击媒介,所以请当心!

第16章:不要成为帮凶

如本章所述,你可能无意间充当了对他人进行黑客攻击的帮凶。一定要堵住这些安全漏洞,做一个好的互联网公民。

第17章:拒绝服务攻击

在本章中,我将向你展示拒绝服务攻击(DoS)如何操纵大规模的网络流量使你的网站宕机。

第18章:总结

最后一章是一个备忘录,帮你回顾在本书中学到的安全相关的关键要素,并概括你在考虑安全性时应该使用的高级原则。


[1]这里的“管道”(tube)是指连接互联网各个节点之间的通道。——译者注