JavaScript对象与地图-如何处理特殊键

JavaScript Object vs Map - how to handle special keys?

本文关键字:处理 何处理 对象 地图 JavaScript      更新时间:2023-09-26

在Java中,我发现直接取一个字符串并将其用作LinkedHashMap中的键。我甚至可以将它翻译成JSON并返回,而不会遇到任何麻烦。

我现在使用Node.JS/JavaScript,有一个特殊情况没有处理。

var makesSense = '{"__proto__":"foo","toString":"bar"}'
var noSense = JSON.stringify(JSON.parse('{"__proto__":"foo","toString":"bar"}'))
console.log(noSense) // outputs {"toString":"bar"}

建议用什么方法来处理__proto__和其他类似的事情。看起来toString不会造成任何麻烦,但假设我需要对不可信的数据进行一致的处理。建议的解决方案是什么?

  • 在每一个键之前准备一个额外的字符?如果是,什么角色最有意义?我知道它不能是下划线,那么空格呢
  • 使用为我处理此问题的模块?我想要一个能方便地处理这个问题并且没有过多功能的。(不过有些功能会很好)
  • 还有别的吗?是否有与JSON.parse兼容的解决方案

为什么这很重要?毫无疑问,没有人会意外地键入__proto__。但如果他们这样做是故意的呢。他们知道我在用JavaScript,那又怎样?-除以下情况外没有任何问题:

  • 软件有一组字符串。碰巧其中一个字符串说__proto__,因为有人试图破坏我的软件
  • 软件使用这些字符串作为键创建Map,并用一些漂亮的数据填充Map
  • 软件稍后会遍历字符串数组,并从Map中收集信息。Map返回一些null,然后boom:null指针异常
  • 软件现在不起作用。这有点像拒绝服务

我知道这种情况非常罕见,但我不喜欢。我记不清我使用的编程语言的所有怪癖,所以如果有足够的时间,我一定会写这种代码。

我为创建不受篡改的代码而自豪。所以,我正试图从我的软件中消除这些针孔。

是的,这些都是非常次要的,但至少值得问一个StackOverflow问题,看看人们是否有比我知道的更好的答案。我通过这种方式学到了很多。

在每一个键之前准备一个额外的字符?如果是,什么角色最有意义?我知道它不能是下划线,那么空格呢?

我使用x,但它是任意的。只要你使用了一些不太可能形成特殊属性名称的东西,比如(在某些引擎上)__proto__toStringvalueOf(我不知道有任何以x开头的特殊属性名称),你就可以了。