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 ドキュメントの失敗を覚えておいてください__proto__

のようなクラスを使用するHashか、少なくとも次のプレフィックス付きのキーにアクセスする必要があります。

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

Web サーバーに送信される内容を制御することはできません。まったく。これまで。

したがって、サーバーに送信されたものに応答して、サーバーが行うことを制限する必要があります。これの一部は、コードによって作成された JavaScript オブジェクトを表す JSON であっても、すべてのユーザー入力を検証することです。

于 2012-07-04T19:33:29.937 に答える
0

いいえ、オブジェクトは基本的に白紙の状態であり、特別なキーはありません。その上、誰かがあなたの Javascript をハッキングしたとしても、非常に緩いセキュリティ ポリシーを使用していない限り (Javascript にルート パスワードを設定するか、そのようなばかげたことをするなど)、サーバーを制御できる可能性はほとんどありません。

于 2012-07-04T19:31:01.957 に答える