JavaScript 对象与 Map - 如何处理特殊键?

3
在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,然后发生null指针异常。 - 软件现在无法正常工作。这将被视为某种拒绝服务。
我知道这种情况绝对很少见,但我不喜欢它。 我记不住我正在使用的编程语言的所有怪癖,因此在足够长的时间内,我必须编写这种代码。
我以创建不易受篡改的代码为荣。 因此,我试图从我的软件中消除这些小漏洞。
是的,这些都是超级微小的问题,但至少值得在StackOverflow上提问,看看人们是否有比我更好的答案。 我通过这种方式学到了很多。

你正在尝试解决的实际问题是什么?我觉得在现实世界中,你很难遇到像__proto__toString这样的键的JSON数据。 - T.J. Crowder
1
顺便提一下,在Opera浏览器中,上面的代码片段输出正确。 - Bergi
你可以尝试修补你的Node.js安装并禁用__proto__的怪癖 :-) - Bergi
1
我在V8Node.JS上发布了一个问题报告。 - 700 Software
@Bergi,我很想知道怎么做。我可能会只为Map对象禁用它。这样,我就不会破坏所有其他对象了。 - 700 Software
另一个Opera测试:没有原型的对象(例如Object.create(null))将允许无问题地分配和检索__proto__属性。 - Bergi
1个回答

0
在每个键前面添加额外的字符?如果是这样,什么字符最有意义?我知道它不能是下划线,那么空格呢?
我使用了一个 x,但这是任意的。只要您使用一些不太可能形成特殊属性名称的东西(例如在某些引擎上),例如 __proto__、toString 或 valueOf(而且我不知道以 x 开头的任何特殊属性名称),那么您就可以放心使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接