第 1 章 什么是 Web 应用的安全隐患

第 1 章 什么是 Web 应用的安全隐患

本章将对“安全隐患”这一贯穿全书的主题加以概述,包括什么是安全隐患,安全隐患会带来哪些问题,安全隐患是如何产生的,等等。本章最后会给出全书的结构和学习方法。

1.1 安全隐患即“能用于作恶的 Bug”

程序 Bug 对于开发者来说如同家常便饭。应用程序有了 Bug,就会出现各种不正常的现象。例如,显示出错误的结果、需要进行的处理迟迟不能结束、网页布局错乱、响应速度极为缓慢等。而这其中,有一种 Bug 能被恶意利用。此类 Bug 被称为安全隐患(Vulnerability),有时也被称为安全性 Bug。

以下是一些恶意利用的常见案例。

  • 未经许可浏览用户个人信息等隐私信息

  • 篡改网站的内容

  • 使网页浏览者的计算机感染病毒

  • 伪装成他人来窥探用户的隐私信息、发布文章、在线购物、肆意转账等

  • 使目标网站不能被访问

  • 在网络游戏中让自己达到无敌状态,或非法获得游戏中的装备道具

  • 在确认自己的个人信息时,能看到别人的个人信息 1

1能看到其他用户个人信息的 Bug 虽不是故意作恶,但由此而偶然造成的不良后果也被视为安全隐患。

如同程序员对一般的 Bug(无奈地)习以为常一样,Web 应用程序开发者对安全隐患也同样已经司空见惯。倘若开发 Web 应用程序时对安全隐患一无所知,就会开发出能被用来进行上述恶举的网站。针对这一问题,本书将从原理到具体对策,来详细讲述如何在开发 Web 应用时杜绝安全隐患。

1.2 为什么存在安全隐患会有问题

为什么存在安全隐患会有问题,这是个越思考就越深入的课题。接下来,就让我们从几个方面来探讨一下必须杜绝安全隐患的原因。

  • 经济损失

    应杜绝安全隐患的原因之一为,假如网站的安全隐患被恶意利用,网站的经营者将会蒙受经济损失。典型的损失为以下几项。

    • 赔偿用户的经济损失

    • 给用户寄送代金券作为补偿时的花销

    • 网站暂停运营造成的机会损失

    • 信誉度下降造成的营业额减少

    此类经济损失的总额有时会高达数十亿日元。

    然而,或许有人会有这样的疑问。如果网站的营销规模并不大,上述列举的各项经济损失就会变得相对较小。所以可能有些网站运营方就会采取这种思路:事前不做相应对策,万一出事了就赔偿用户的损失。2

    但是,实际的损失并不仅限于经济损失。

  • 法律要求3

    《个人信息保护法》是规定网站实施安全性措施的法律。该法第 20 条规定,拥有超过 5000 名用户的网站运营方,作为个人信息经营者,有义务实施网站的安全管理措施。

    (安全管理措施)

    第二十条 个人信息经营者,为了安全管理其用户的个人信息,必须采取必要且恰当的措施,防止用户的个人信息被泄漏、删除或损坏。

    安全管理措施的具体内容,由各省厅分别制定规章。其中,“经济产业领域关于个人信息保护法的指导方针”中,“技术性安全管理措施”中的“‘个人数据访问控制’的实践方法示例”一节中有如下记载。

    检验处理个人信息的系统中引入的访问控制功能的有效性。

    (例如,检验网络应用是否存在安全隐患。)

    也就是说,通过 Web 系统管理个人信息的运营者受到《个人信息保护法》以及相关规章的约束,承担着对 Web 应用的安全隐患采取安全管理措施的法律义务。

  • 对用户造成不可逆的伤害

    应该意识到,安全隐患造成的事故会给用户带来很多不可逆的伤害。个人信息一旦泄漏,就不可能再回收。账号被盗而导致用户的名誉受损之后,就再也回不到以前的状态了。另外,如果用户的信用卡账号被泄漏,即使赔偿了用户的金钱损失,也不可能完全平抚用户受到的恐慌、不安等精神上的痛苦。换言之,一旦发生了安全事故,就会出现很多金钱无法解决的问题。

  • 欺骗用户

    大多数网站都会夸耀自身有多么安全。没有网站会表示“本站完全不保证安全性,对于可能出现的安全问题概不负责”。假如网站强调了自己的安全性,就最好将安全隐患消除干净。安全隐患的存在会极大地影响网站的信誉度与可信任性。

  • 被用于构建僵尸网络

    僵尸网络(Botnet)的存在,是威胁互联网安全的主要因素之一。僵尸病毒(Bot)是一种恶意代码(Malware),计算机被感染后就能够被外界远程操纵,用来发送垃圾邮件或执行 DDoS 攻击(分布式拒绝服务攻击)等恶意行为。据传,2010 年初爆发的 Gumblar 恶意程序的目的之一就是构建僵尸网络。

    Web 应用的安全隐患也可能被用于构建僵尸网络,情形如图 1-1 所示。

    {%}

    图 1-1 Web 应用的安全隐患被用来构建僵尸网络

    攻击者首先会篡改存在安全隐患的网站的内容,并设下圈套试图让浏览者的计算机感染僵尸病毒。假如浏览网站的用户的计算机存在安全隐患,就会感染上僵尸病毒,从而便能够接受攻击者的命令。进入僵尸网络的计算机 4 会被用来发送垃圾邮件或执行 DDoS 攻击。另外,有时僵尸机器也会去攻击新的服务器。如此这般,新被入侵的机器也加入到了被控的僵尸 Web 服务器集群,那么被感染僵尸病毒的计算机集群的数量就会不断扩大。

    据传,僵尸网络带来的收益是网络犯罪者的一项主要收入来源。换言之,在互联网上发布一个带有安全隐患的网站,就有被反社会势力利用的可能性。

2这种策略被称为“风险自留”。

3本节阐述的是日本的相关法律,供中国读者参考。遗憾的是,截至译稿时(2013 年 9 月),中国在网络安全隐患方面还没有推出相应的法律法规。——译者注

4俗称“肉鸡”。 ——译者注

1.3 产生安全隐患的原因

接下来本节将说明安全隐患产生的原因,据此就可以理解为何笔者之前会说“Web 应用程序开发者对安全隐患已经司空见惯”。

首先,产生安全隐患的原因可分为以下两类。

(A)由 Bug 造成

(B)由检验功能不完善造成

情况(A)包含 SQL 注入(SQL Injection)和跨站脚本(Cross Site Scripting,简称 XSS)等极具影响力的著名的安全隐患。此类隐患不仅发生场所与安全性毫不相关,而且波及范围能扩散至整个应用程序,着实让人头疼。因此,开发团队的每一个成员在编写应用程序时就必须具有极强的安全意识,但可惜目前还有很多开发团队并未这么做。

另一方面,目录遍历(Directory Traversal)漏洞是情况(B)中一个代表性的例子。产生此类安全隐患的原因是很多开发者缺乏执行安全检验的意识,而且同(A)一样,它造成的影响也会波及整个应用程序。

由此可见,Web 应用的安全隐患可以被形象地比喻为“在意想不到的地方隐藏着的一个很深的陷阱”。因此,一直以来安全隐患都在源源不断地产生。但是,与真正的陷阱不同的是,我们能够通过学习提前得知哪里会有陷阱。

1.4 安全性 Bug 与安全性功能

本章开头我们提到安全隐患是一种 Bug,但有时即使修正了所有 Bug 也不能保证应用程序绝对安全。举例来说,没有使用 HTTPS 协议(超文本传输安全协议)来加密传输的状态并不能算作是 Bug,这种情况下,虽然不存在(狭义的)安全隐患,但是传输的内容却存在被窃听的可能性。

如同使用 HTTPS 来对传输内容进行加密那样,积极主动地加强安全性的措施在本书中被称为“安全性功能”。安全性功能实为应用程序的一种需求,所以也被称为安全性需求。

从开发管理这一层面上来说,将应用程序安全性方面的 Bug 和需求这两者整理清楚也是至关重要的。如同 Bug 必须被消除一样,消除安全隐患也应当是理所当然的。另一方面,是否将安全性功能加入到项目需求中,则应该由软件的发包方结合项目经费作出决定。

为了让读者有意识地区分安全性 Bug 和安全性功能,本书特意将两者分别独立成章来加以细述。

1.5 本书的结构

本书结构如下。

第 1 章,引入安全隐患这个概念,介绍安全隐患是如何产生的,说明安全性 Bug 和安全性功能的区别。

第 2 章,搭建本书的试验环境。本书通过 VMware 的虚拟机提供了可以实际体验安全隐患的环境。该章会介绍搭建此虚拟机环境和安装诊断用工具的方法。

第 3 章,讲述 HTTP、Cookie、会话(Session)管理等 Web 应用安全方面的基础知识,还会介绍同源策略。

第 4 章,全书的核心章节。针对 Web 应用的每一个功能中易产生的安全隐患模式,对其原理及对策等各个方面加以详细说明。

第 5 章,讲述认证、账号管理、授权、日志输出等典型的安全性功能。

第 6 章,讲述字符编码与安全性的关系。Web 应用安全隐患的起因很多都涉及字符编码。本章将讲述字符编码的基础知识、安全隐患产生的原因和相应的对策。

第 7 章,从 Web 应用以外的方面,描绘提高网站安全性措施的全景。

第 8 章,讲述如何开发安全无虞的 Web 应用。

目录

  • 推荐序
  • 译者序
  • 前言
  • 谢辞
  • 第 1 章 什么是 Web 应用的安全隐患
  • 第 2 章 搭建试验环境
  • 第 3 章 Web 安全基础 :HTTP、会话管理、同源策略
  • 第 4 章 Web 应用的各种安全隐患
  • 第 5 章 典型安全功能
  • 第 6 章 字符编码和安全
  • 第 7 章 如何提高 Web 网站的安全性
  • 第 8 章 开发安全的 Web 应用所需要的管理