Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JSON.parse 与 localStorage 的故事

  JSON.parse 是个蛋疼的设计,当它的参数不为有效 JSON 时会直接抛出 SyntaxError,如果这个错误没有被 catch 就会终止当前 JavaScript 的执行帧。所以我的建议是:除非是将 JSON.stringify 的结果直接 parse,否则都应该将 JSON.parse 放在 try 语句中。
  经常会看到一些将 localStorage 中的数据取出来就直接 JSON.parse 的做法。我觉得这是很危险的!也许这个行为并不会直接产生什么安全问题,但是 JSON.parse 毕竟是一个会 throw 的函数,出了问题会导致它后面的代码全都无法执行。如果它之后有什么重要代码,被 throw 掉就要呵呵了。
  也许大家会觉得,localStorage 是我自己 JSON.stringify 后写进去的,怎么可能无法解析?这个想法就像是把自行车停在街上不上锁一样。也许确实停着几天也没被偷,那都是侥幸。写程序怎么能抱着这样的侥幸呢?把数据放在 localStorage 这种人人可写的地方就和自行车直接停到街上一个道理,甚至更糟糕的是自行车可以上锁,而 localStorage 不行。
  只要自行车没被偷就还可能有这样的言论:「项目的代码规范已经约定了 localStorage 的命名,不会被别人误写。」我承认开发团队自己几乎不会出现 localStorage 冲突的情况,但不能排除第三方程序甚至页面产生 XSS 漏洞时注入的恶意程序不会去动 localStorage。
  假如页面由于 XSS 被注入了一段奇怪的程序,它污染了 localStorage。即使这个 XSS 漏洞修复了,被污染的 localStorage 也无法立即恢复。如果页面上有不在 try 中的 JSON.parse 就会 throw。如果 JSON.parse 后面还有什么非执行不可的代码,那么整站就挂了,而且脏数据是储存在客户端还不容易恢复(更讽刺的是恢复客户端的脏数据最有效的办法依然是 try)。
  我只想说 不要给未来埋下坑
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^