1
var x = Object.create(null);
x["hello"] = "world";

但是我可以允许未经验证的用户输入作为键吗?我想将其用作玩家名称 -> 玩家对象地图。玩家名称将仅受长度 32 的限制。我担心是否有特殊的属性键可以让玩家获得对服务器的控制权。

编辑:我没有制作网络服务器。JavaScript 将通过嵌入游戏服务器的 SpiderMonkey 在服务器端运行。如果有人劫持了在那里运行的 JavaScript,他们可能会毁掉游戏。

4

4 回答 4

2

属性键始终是字符串。您永远不会遇到任何属性名称的问题,除了可能:

  • Object.prototype.hasOwnProperty. 例如在:

    var obj = {hasOwnProperty:'fail'};
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) ; // ...
    }
    

    这可以通过使用Object.keys(obj).forEach( ... )或解决:

    for (var i in obj) {
        if (Object.hasOwnProperty.call(obj, i)) ; // ...
    }
    
  • 唯一的危险是由您处理对象的方式引起的。前面的例子不是一个不常见的用法hasOwnProperty,但是它可以用来破坏你的脚本,因为你不期望键名hasOwnProperty。这同样适用于.toString或对象的任何其他属性,这些属性可以通过设置新名称来覆盖。
于 2012-07-04T19:33:50.830 回答
2

一言以蔽之:不,只记得Google Docs__proto__失败了

您应该使用Hash-like 类,或者至少访问这些前缀为:

var hash = {}, key = "something-evil", value = Math.PI;
hash["$" + key] = value;
console.log( hash["$" + key] == value );
于 2012-07-04T19:42:38.673 回答
0

不,一个对象基本上是一张白板,没有特殊的键。最重要的是,即使有人入侵了您的 Javascript,他们也不太可能控制您的服务器,除非您使用非常松散的安全策略(例如将 root 密码放入您的 Javascript 中或类似的傻事)。

于 2012-07-04T19:31:01.957 回答
0

您无法控制将发送到 Web 服务器的内容。完全没有。曾经。

因此,您需要限制服务器将执行的操作,以响应发送给它的任何内容。其中一部分是验证所有用户输入,即使它是表示由您的代码创建的 JavaScript 对象的 JSON。

于 2012-07-04T19:33:29.937 回答