教你如何安全的使用 ECMAScript 2019

ECMAScript 2019,也称为 ECMAScript 10,是 JavaScript 的最新版本。发布于2019年,它包含了一些重要的新特性和功能,例如 Array flat 和 flatMap 方法、Object 属性描述符的修改、Symbol 属性的扩展等等。然而,虽然这些新特性能够提升我们的开发效率,但在使用它们时也需要注意一些安全问题。本篇文章将会介绍一些关于 ECMAScript 2019 的安全问题以及相应的解决方案,帮助你更加安全地使用这些新特性。

1. 避免使用不安全的全局变量

在 ECMAScript 2019 中,有一些新的全局变量被引入了,例如 BigInt 和 globalThis。然而,这些全局变量在一些旧的 JavaScript 运行环境中可能不存在,或者被定义为其他值。因此,在使用这些变量时,要先进行兼容性判断,以避免在某些环境中引发错误。

示例代码:

-- ------- ------ --- ------------ -
  --------------- ---------- ------- ----------
- ---- -
  ----- --------- - -------------------
  -----------------------
-

-- ------- ---------- --- ------------ -
  -- ----------
  --------------------
- ---- -
  ------------------------
-

2. 小心使用 Promise.allSettled

ECMAScript 2019 引入了 Promise.allSettled 方法,它可以接收一个 Promise 数组,并返回一个 Promise,该 Promise 在所有输入 Promise 状态都 settle 后才会 resolve。与 Promise.all 不同的是,Promise.allSettled 不会因为某个 Promise reject 而中止执行。然而,这个方法的返回值可能会暴露敏感数据,因此需要小心地使用。

示例代码:

----- -------- - -
  -----------------------
  ----------------------
  ----------------------
--

----------------------------
  ------------- -- -
    ---------------------
  --
  ------------ -- -
    ---------------------
  ---

在这个例子中,Promise.allSettled 方法会返回三个对象组成的数组,每个对象分别包含了一个 Promise 的状态和值。由于配置错误可能会导致这些值暴露在浏览器控制台中,因此在使用 Promise.allSettled 时需要谨慎考虑数据安全性。

3. 使用正则表达式时小心使用 s 标志

ECMAScript 2019 引入了 s 标志,可以让点号 (.) 匹配换行符。虽然这个特性在某些场景中非常有用,但同时也可能引发安全隐患。一个恶意用户可以通过包含换行符的输入强制让一个匹配点号 (.) 的正则表达式匹配到更多内容,从而导致应用程序出现漏洞。

例如,考虑一个使用 s 标志的正则表达式 /[a-z].+/s。如果一个用户输入 "example\nscript",则会匹配到 "example\nscript",而不仅仅是 "example"。

为了避免这种情况,可以使用 [\s\S] 替代点号 (.),例如 /[a-z][\s\S]+/。

示例代码:

----- ----- - ------------------

-- -------
----- ----- - -----------
-------------------------------- -- ----------- ---------

-- -------
----- --------- - ---------------
------------------------------------ -- -----------

4. 避免使用不安全的 Object.assign

在 ECMAScript 2019 中,Object.assign 方法现在支持复制 可枚举的 Symbol 属性。然而,在使用这个方法时要注意它存在一些安全问题。特别地,如果第一个参数是 null 或 undefined,则这个方法会抛出 TypeError。此外,Object.assign 会复制源对象的所有属性,包括 getter 和 setter,这可能会导致安全隐患。

示例代码:

----- ------- -
  ------------------ -
    ----------- - ------
  -

  --- ------- -
    ------------------- ---------
    ------ ------------
  -

  --- --------------- -
    ------------------- ---------
    ----------- - ---------
  -
-

----- -------- - --- ---------------
----- ---- - ----------------- ----------
------------------------ -- -----
---------- - ------ -- ------- -------
---------------------------- -- -----

在这个例子中,我们创建了一个类 Example,它包含一个 getter 和一个 setter。当我们使用 Object.assign 来复制这个对象时,它会将 getter 和 setter 也复制到新对象中,并导致修改 copy 的属性也会修改 original 的属性。为了避免这种情况,我们应该使用合适的方式进行属性拷贝。

5. 关注 URLSearchParams 的安全性

ECMAScript 2019 引入了 URLSearchParams 接口,它可以用来解析、操作 URL 查询字符串。这个接口提供了一些方便的方法,并能够防止注入攻击。然而,URLSearchParams 也存在一些安全隐患,如果一个参数名或值包含特殊字符(例如 &、+、/、%、#),则可能导致 URL 构造出错,或暴露敏感信息。

示例代码:

----- ------ - --- ---------------------------------------------------
------------------------------- -- -----
------------------------------- -- ---
------------------------------- -- ---------------

----- ------ - --- - ------------------
-------------------- -- ----------------------------------------

在这个例子中,我们使用 URLSearchParams 解析了一个查询字符串并打印了其中的参数值。然后,我们使用 toString 方法将其重新构造为查询字符串,可以发现%、/、&这些特殊字符被正确编码。遵循 URL 规范并使用 URLSearchParams 可以有效保证 URL 安全。

结论

在使用 ECMAScript 2019 时,我们需要注意一些安全问题。在避免使用不安全的全局变量、小心使用 Promise.allSettled、避免使用不安全的 Object.assign、注意 URLSearchParams 的安全性等方面,我们可以更加安全地使用这些新特性。同时,我们也需要关注浏览器兼容性和数据安全,以保证应用程序的完整性和可靠性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671cd5e29babaf620fb30011