JavaScript 安全性:Web 到 Windows 8: 安全性

多年前,我认为学习如何打高尔夫是个不错的想法。我在注册学习本地一些驾驶培训课程前,从未加入过高尔夫俱乐部。在我的第一堂课中,教师问我是否学习过同类课程或打过高尔夫。我告诉他没有时,他说:“很好!我们将不必担心一些阻碍您进步的旧习惯了。”
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)

通 过将数据限制为“已知有用”的数据开始进行输入验证。熟悉 HTML5 的 Web 开发人员可以使用对其新输入类型和属性的现有知识来限制进入 Windows 应用商店应用程序的数据。Web 和 Windows 8 的主要区别在于 Windows 应用商店应用程序没有在后台检查输入的服务器。限制数据必须在 HTML5 或 JavaScript 中进行。
使用 HTML5,可以轻松将每个字段限制为已知的有用数据。为了说明本文中的示例,我使用了虚构的 Contoso Health 应用程序,它存储用户的个人健康信息。此应用程序的“个人资料”页捕获用户的名称、电子邮件地址、体重和身高,并提供一个包含一般信息的注释字段。作为开 发人员,我通常知道每个字段的有用数据是什么样的数据:

  • 名称: 包含几个特殊字符的字母字符,最多不超过 45 个字符。名称条件基于应用程序的目标市场:美国市场。
  • 电子邮件地址: 输入必须采用有效的电子邮件地址格式。
  • 体重和身高: 带相关标签的数字,显示以英尺、英寸和磅为单位的数据。
  • 注释: 使用标准 Contoso HTML 编辑器的 HTML 内容。

对于“名称”输入元素,我需要限制什么字符对于字段有效,以及该值的长度是多少。我可以使用 input 标记的两个新属性来做到这点: pattern 和 title。
pattern 是指输入的数据必须符合的正则表达式。MSHTML(Windows 8 中用于 HTML5 应用程序的呈现引擎)验证输入字段的数据是否与正则表达式匹配。如果用户输入不符合正则表达式模式的数据,提交表单将失败,并指导用户更正无效的字段。例 如,“名称”字段可以包含字母字符和空格,且只能包含 3-45 个字符。以下 pattern 值支持:

双击代码全选

1

2

        <input type="text" id="txtName" name="txtName"

pattern="^[A-Za-z ]{3,45}$" title="" />

 

title 用于告知户系统要求什么内容。在本例中,诸如“名称必须包含 3-45 个字符且只能使用字母字符或空格”的语句将说明期望的模式。没有什么比输入无效且不知道怎样的输入有效更令用户沮丧了。请友善地向您的用户提供帮助,让他 们知道允许输入哪些内容。title 属性的作用就在于此,它是说明字段所需内容的消息。
包含可接受字符和长度的数据字段模式可能很难确 定。您可以在很多实用的在线资源中找到示例正则表达式,但是请始终咨询您所在组织的安全团队,了解是否有您必须符合的标准。如果您所在组织没有安全团队或 安全团队未设置标准,诸如 RegExLib.com 的资源可提供您可用于数据验证的正则表达式的实用库。
某些字段是特定数据类型,如数 字、日期和电子邮件地址。HTML5 将再次发挥作用,它提供很多新输入类型,如电子邮件、电话、日期、数字等。使用这些数据输入类型,MSHTML 可检查用户输入的内容是否是有效的数据,而无需编写任何正则表达式或 JavaScript 代码。输入元素的 type 属性处理新数据类型。(您可以在 bit.ly/OH1xFf 上查找更多类型和它们的用法。) 例如,为了捕获“个人资料”页的电子邮件地址,我将 type 属性设置为 email,如以下示例中所示:

双击代码全选

1

<input type="email" id="txtEmail" name="txtEmail" />

 

此字段仅当值符合有效电子邮件地址的格式时才接受它。如果 MSHTML 未将输入识别为有效电子邮件地址,当用户尝试提交表单时将在该字段上显示验证错误。使用 HTML5 的新输入类型将数据限制为您希望的样式,不必进行复杂的 JavaScript 验证。
一些新输入类型还允许使用新的 min 和 max 属性来进行范围限制。例如,由于业务规则,我们应用程序中的人员身高必须介于 3 到 8 英尺。可以对“身高”字段使用以下范围限制:

双击代码全选

1

<input type="number" id="txtHeight" name="txtHeight" min="3" max="8" />

 

这 些示例提供了使用 HTML5 input 标记限制数据的四种方法。通过验证长度(使用模式)、格式(再次使用模式)、数据类型(使用新的输入类型)以及范围(使用最小值/最大值),您可以将数据 限制为已知的有用数据。并非所有属性和类型都在提交前提示您更正它们。请确保使用 checkValidity 方法验证您表单的内容 (bit.ly/SgNgnA),就像在 ASP.NET 中验证 Page.IsValid 一样。您可能想知道仅使用 JavaScript 是否可以像这样限制数据。是的,您可以,但是使用 HTML5 属性可以减少开发人员需要管理的代码量,因为它将所有繁重工作交给了 MSHTML 引擎。
拒绝已知的坏(即拒绝列表)输入。拒绝的一个好示例是创建无法连接到您的 Web 应用程序的 IP 地址的拒绝列表。当您为要阻止的对象定义相对固定的范围时,拒绝列表很有用。例如,考虑向组(如您的开发小组)发送电子邮件,然后将个别人从开发小组电子 邮件列表中删除。在此示例中,您知道要从开发小组列表中拒绝哪些电子邮件地址。为了确保软件安全,您想将工作重点放在限制(允许列表)而非拒绝(拒绝列 表)上。请始终记住随着攻击者找到更新颖的方法来绕过软件防御机制,已知的错误数据在不断变化。在上例中,设想有新的开发人员加入开发小组,需要审查他们 是否应包含在电子邮件中。从长远来看,与在拒绝列表中包含数千项相比,限制方式更便于管理,提供了更便于维护的列表。
有时,数据同时包含已 知的有用数据和已知的错误数据。例如,HTML 内容就包含这两种数据。一些标记被批准显示而另一些标记则不允许显示。剔除或禁用已知的错误数据和允许已批准的数据的过程称为“净化输入”。 Contoso Health 应用程序中的“注释”字段就是这方面的一个示例。用户可以通过 HTML 编辑器输入 HTML 标记,但是当输入内容在应用程序中显示时只呈现某些 HTML 标记。“净化输入”通过剔除不安全的内容和不呈现未明确批准的内容,去掉了可能的恶意数据,确保输入安全的内容。如果您使用 innerText 而非 innerHTML 设置 HTML 元素的值(这会将 HTML 内容呈现为文本而非将它解释为 HTML),Windows 应用商店应用程序可执行净化。(请注意如果应用程序将脚本标记的 innerText 设置为 JavaScript,则生成可执行的脚本。) JavaScript 还提供另一个有用的净化工具: toStaticHTML。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Grow your business fast with

Suku