クラス変数に保存されたリクエストデータ

ユーザー固有のリクエストデータがクラス変数に保存されています。

説明

Webリクエストやセッションから取得したユーザー固有のデータをクラス変数に保存すると、同じプロセス内の別のリクエストやインスタンスと値を共有する可能性があります。

リクエストを順番に処理していても、ユーザー固有の値が共有状態に残ることがあります。この問題はマルチスレッド環境に限りません。

想定される影響

  • 前のユーザーの識別子や権限に関する値が、別のユーザーに伝わるおそれがあります。
  • リクエスト間で状態が混ざり、誤った認可判断につながる可能性があります。

対処方法

  • リクエストのデータは、ローカル変数、リクエストごとに新しく作成するインスタンス、ユーザー別のセッションストアなど、範囲が分離された場所に保存してください。
  • ユーザー固有の認証情報、セッション情報、個人情報をクラス変数やモジュールのグローバル変数に保存しないでください。

例

変更前

python
class UserDescription:
    user_name = ""

def update_description(request):
    UserDescription.user_name = request.POST.get("name")

変更後

python
class UserDescription:
    def __init__(self, user_name):
        self.user_name = user_name

def update_description(request):
    return UserDescription(request.POST.get("name"))

説明:

  • 変更前: クラス変数に保存したユーザー固有のリクエストデータが、プロセス内で共有されます。
  • 変更後: リクエストごとに新しいインスタンスを作り、値を分離します。同じインスタンスを複数のユーザーで共有すると、インスタンス変数でもデータを分離できません。

参考資料