JavaScript Object vs Map - 如何处理特殊键?

时间:2013-02-06 21:39:28

标签: javascript node.js object map

在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问题,看看人们是否有比我知道更好的答案。我通过这种方式学到了很多东西。

1 个答案:

答案 0 :(得分:0)

  

在每个键之前添加一个额外的字符?如果是这样,哪个角色最有意义?我知道它不能成为一个下划线,那么空间呢?

我使用x,但这是任意的。只要你使用不太可能形成特殊属性名称的东西(如某些引擎上)__proto__toStringvalueOf(我不知道任何特殊属性)以x开头的名字,你很好。