在前端开发中,处理 JSON 格式的数据是非常常见的操作。而在 ES11 中,我们可以更加安全地进行 JSON.parse 和 JSON.stringify 的数据处理,以避免潜在的安全风险。
JSON.parse 的安全问题
JSON.parse 方法是将 JSON 格式的数据转化为 JavaScript 对象的常用方法。但是,如果传入的字符串不是合法的 JSON 字符串,则可能会引起程序的异常,从而导致安全问题。
例如,当我们传入一个字符串如下所示:
const jsonStr = '{"name": "Alice",}'; JSON.parse(jsonStr);
我们会得到一个 SyntaxError 的异常:
Uncaught SyntaxError: Unexpected token } in JSON at position 15
这是因为这个字符串的最后一个逗号会让 JSON.parse 解析失败。
新增的安全 JSON.parse 静态方法
为了避免上述的安全问题,ES11 新增了一个安全的 JSON.parse 静态方法:JSON.parseJSON()。
如果我们使用 JSON.parseJSON() 来解析上述的字符串,我们便不会再得到异常了,而是会得到一个 undefined 的返回值:
const jsonStr = '{"name": "Alice",}'; JSON.parseJSON(jsonStr); // undefined
这种做法能够保证当异步请求返回空字符串时,我们不会意外地得到一个 undefined 的返回值。这对我们处理前端数据异常和防止 XSS 攻击都是非常有用的。
JSON.stringify 的安全问题
JSON.stringify 方法是将 JavaScript 对象转化为 JSON 格式的数据的常用方法。虽然 JSON.stringify 的安全问题并不像 JSON.parse 那么明显,但是如果对象中包含未定义或不可枚举的属性,也会导致 JSON.stringify 失败。
例如,当我们传入一个包含未定义属性的对象:
const obj = { name: 'Alice', age: undefined }; JSON.stringify(obj);
我们会得到一个包含未定义属性的 JSON 对象:
{"name":"Alice","age":undefined}
这是因为 JSON.stringify 不能正确地处理未定义属性,所以我们需要做一些特殊处理,以避免这种情况的发生。
新增的 toJSON 方法
ES11 新增了一个 toJSON 方法,用于 JSON.stringify 的特殊处理。
我们可以在需要进行特殊处理的对象中,添加 toJSON 方法来覆盖默认的 JSON.stringify 行为。
假设我们有一个 Date 对象,我们可以这样定义它的 toJSON 方法:
const date = new Date(); date.toJSON = function() { return this.toLocaleString(); };
然后,当我们对它进行 JSON.stringify 时,便会得到我们想要的结果:
JSON.stringify(date); // "5/10/2022, 5:19:19 PM"
我们还可以应用这个 toJSON 方法来对 undefined 进行特殊处理,以避免 JSON.stringify 对未定义属性的不恰当处理。
-- -------------------- ---- ------- ----- --- - - ----- -------- ---- ---------- ------- ---------- - ----- ------ - --- --- ------ ----- ------ -- --------------------- - -- ------- ----- --- ------------ - ----------- - ------ - - ------ ------- - -- -------------------- -- ----------------
这段代码中,我们定义了一个 toJSON 方法,它会将对象中的未定义属性过滤掉,并返回一个由非未定义属性组成的新对象。然后,当我们对这个对象进行 JSON.stringify 时,我们便不会再得到之前的 undefined 了。
总结
在 ES11 中,我们可以更加安全地处理 JSON.parse 和 JSON.stringify。对于 JSON.parse,我们可以使用 JSON.parseJSON() 来减少 JSON 解析失败的安全风险,而对于 JSON.stringify,我们可以使用 toJSON 方法来在必要的情况下覆盖默认的 JSON.stringify 行为。
我们应该在开发过程中注意这些方法的使用,以避免潜在的安全风险和数据异常。同时,我们也应该在实际项目中积极应用这些技巧,并不断学习和掌握更多前端技术的知识。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6651d9b9d3423812e4635e2e