多年前,我认为学习如何打高尔夫是个不错的想法。我在注册学习本地一些驾驶培训课程前,从未加入过高尔夫俱乐部。在我 的第一堂课中,教师问我是否学习过同类课程或打过高尔夫。我告诉他没有时,他说:“很好!我们将不必担心一些阻碍您进步 的旧习惯了。”
Web 开发人员从浏览器过渡到 Windows 应用商店应用程序时会沿袭一些固有习惯。尽管 Web 开发人员可 以利用现有的 JavaScript 知识,但由于新增了一些功能,因此需要转变思维方式。安全性就是这样一个有根本差异的功能。很 多 Web 开发人员习惯将应用程序的安全性转交给服务器实现,他们给出诸如以下的理由:“何必麻烦呢?我们可以很轻松地绕过 JavaScript。”在 Web 客户端,安全功能仅被视为提高可用性的方法,无法增强 Web 应用程序的总体安全性。
使用 Windows 8,JavaScript 通过提供保护数据、验证输入和分隔潜在恶意内容所需的工具,在确保您应用程序的总体安全性方面发 挥重要作用。在本文中,我将向您介绍如何改变在 Web 开发过程中养成的一些习惯,以便使用 HTML5、JavaScript 和 Windows 运行时的安全功能生成更安全的 Windows 应用商店应用程序。
输入验证
Web 开发人员说:JavaScript 验证只 用于改进使用性能,而不会增强应用程序的安全性。
Windows 8 开发人员说:使用 HTML5 和 JavaScript 进行验证是您 防止恶意内容进入应用程序的第一道防线。
对于传统 Web 应用程序来说,JavaScript 通常只是服务器的网关。所有对数 据的重要操作(如输入验证和存储)都在服务器上进行。恶意攻击者可以在自己的浏览器上禁用 JavaScript 或直接提交精心设 计的 HTTP 请求来绕过所有客户端保护机制。在 Windows 应用商店应用程序中,开发人员在对数据进行操作前不能依赖服务器来 清理用户输入,因为没有服务器。要进行输入验证只能依靠 JavaScript 和 HTML5。
在软件安全性方面,输入验证是确保 数据完整性的重要一环。没有它,攻击者就可以将每个输入字段作为可能攻击 Windows 应用商店应用程序的攻击矢量。在《编写 安全的代码》第二版 (Microsoft Press, 2003) 中,作者 Michael Howard 和 Steve Lipner 提到: “所有输入在得到证明之 前都是不可信的,”这已成为有关管理输入的名言。
您不应信任任何数据,直到证明它符合“已知有用”数据的规范。构 建应用程序时,开发人员知道来自特定字段的数据应像什么(即允许列表),或至少知道它不应该包含什么(即拒绝列表)。进 行输入验证时,尽可能始终使用允许列表以将输入限制为已知的有用数据。通过只允许已知良好的数据,可降低缺少表述错误数 据的新方式或未知方式的可能性。
限制、拒绝和净化
开发人员如何通过将输入限制为已知的有用数据来降低带 给用户的风险?他们使用图 1 中所示的三个输入验证阶段来降低恶意内容进入其应用程序的风险。
图 1 输入验证(图像 基于第 4 章“提高 Web 应用程序安全性: 威胁与对策”中的“安全 Web 应用程序的设计指南”的图 4.4,网址为: bit.ly/emYI5A)