説明
公開メソッドが呼び出し元のリストや配列を内部のprivateフィールドへそのまま保存すると、呼び出し元は後から元のオブジェクトを変更して内部状態を変えられます。
想定される影響
- 検証済みの値や権限のリストが、外部の参照を通じて変更される可能性があります。
- 呼び出し元と内部状態を共有することで、予期しないセキュリティ上の不具合が発生するおそれがあります。
対処方法
- Pythonのリストは
value[:]、list(value)、copy.copy(value)などでコピーして保存してください。浅いコピーでは変更可能な要素が共有されるため、必要に応じて要素もコピーするか、不変の値にしてください。 - NumPy配列の基本スライスはビューを作ります。独立したデータが必要なら
copy()を使ってください。 - 保存前に要素の型と許可する値を検証してください。
例
要素自体を別途コピーする必要がないPythonリストを前提とした抜粋です。
変更前
python
def set_values(self, values):
self.__values = values
変更後
python
def set_values(self, values):
self.__values = values[:]
説明:
- 変更前: 呼び出し元のリストや配列をprivateフィールドへそのまま保存するため、元のオブジェクトを後から変更すると内部状態も変わります。
- 変更後: リストを浅くコピーし、呼び出し元のリストでの追加・削除・要素の置き換えが内部リストへ直接反映されないようにします。