説明
公開メソッドが渡された配列をprivateフィールドにそのまま保存すると、呼び出し側が後から元の配列を変更して、内部状態を変えられます。
想定される影響
- 権限やポリシーのリストに対する検証を回避される可能性があります。
- 外部の参照からの変更によって、オブジェクトが維持すべき条件が崩れるおそれがあります。
対処方法
- 外部から受け取った配列は、スプレッド構文、
Array.from()、slice()などでコピーして保存してください。 - 保存前に要素の型と許可する値を検証してください。
- 浅いコピーでは内部のオブジェクトへの参照が残ります。変更可能な要素は必要な深さまでコピーするか、不変の値として保存してください。
例
変更前
javascript
class AccessPolicy {
#roles = [];
setRoles(roles) {
this.#roles = roles;
}
}
変更後
javascript
class AccessPolicy {
#roles = [];
setRoles(roles) {
this.#roles = [...roles];
}
}
説明:
- 変更前: privateフィールドと呼び出し側が同じ配列を共有するため、元の配列の変更が内部状態に影響します。
- 変更後: コピーを保存し、配列自体を呼び出し側の参照から分離します。