外部配列のprivateフィールドへの直接代入

外部配列をprivateフィールドへ直接代入

説明

公開メソッドが渡された配列をprivateフィールドにそのまま保存すると、呼び出し側が後から元の配列を変更して、内部状態を変えられます。

想定される影響

  • 権限やポリシーのリストに対する検証を回避される可能性があります。
  • 外部の参照からの変更によって、オブジェクトが維持すべき条件が崩れるおそれがあります。

対処方法

  • 外部から受け取った配列は、スプレッド構文、Array.from()、slice() などでコピーして保存してください。
  • 保存前に要素の型と許可する値を検証してください。
  • 浅いコピーでは内部のオブジェクトへの参照が残ります。変更可能な要素は必要な深さまでコピーするか、不変の値として保存してください。

例

変更前

javascript
class AccessPolicy {
  #roles = [];

  setRoles(roles) {
    this.#roles = roles;
  }
}

変更後

javascript
class AccessPolicy {
  #roles = [];

  setRoles(roles) {
    this.#roles = [...roles];
  }
}

説明:

  • 変更前: privateフィールドと呼び出し側が同じ配列を共有するため、元の配列の変更が内部状態に影響します。
  • 変更後: コピーを保存し、配列自体を呼び出し側の参照から分離します。

参考資料