对象作为dictonary的安全性是否真的通过标准确保?

时间:2012-07-04 19:28:17

标签: javascript security

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

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

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

4 个答案:

答案 0 :(得分: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,或者可以通过设置新名称覆盖的对象的任何其他属性。

答案 1 :(得分:2)

总之:不,只记得Google Docs __proto__ fail

您应该使用类似Hash的类,或者至少访问这些前缀的键:

var hash = {}, key = "something-evil", value = Math.PI;
hash["$" + key] = value;
console.log( hash["$" + key] == value );

答案 2 :(得分:0)

不,一个物体基本上是一块空白的石板,没有特殊的钥匙。最重要的是,即使有人攻击你的Javascript,除非你使用非常松散的安全策略(比如将root密码放在你的Javascript中或者是愚蠢的东西),否则他们不太可能获得对你服务器的控制权。那样的。)

答案 3 :(得分:0)

您无法控制将发送到您的网络服务器的内容。完全没有。如初。

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