var x = Object.create(null);
x["hello"] = "world";
但是我可以允许未经验证的用户输入作为键吗?我想用它作为玩家名称 - >球员对象地图。玩家名称只会被长度限制为32.我担心是否有特殊的属性键可以让玩家获得对服务器的控制权。
编辑:我不是在制作网络服务器。 JavaScript将通过嵌入到游戏服务器中的SpiderMonkey在服务器端运行。如果有人劫持了那里运行的JavaScript,他们可能会破坏游戏。答案 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。