クロスサイトリクエストフォージェリ

クロスサイトリクエストフォージェリ

クロスサイトリクエストフォージェリとは、悪意のあるリンクをユーザーにクリックさせ、ログイン認証済みのサイトに侵入しようとする攻撃手法です。悪意のあるリンクにはコマンドが埋め込まれており、ユーザーがログイン中のサイトで自動的に実行される可能性があります。この場合、ユーザーは既に認証済みであるためログイン画面は表示されず、悪意のあるアクティビティの存在にも気付きません。Login with Amazonにおいても、クロスサイトリクエストフォージェリによってクライアントや認証サーバーを偽装されるおそれがあります。

クロスサイトリクエストフォージェリを防ぐため、Login with Amazonではstateパラメーターの使用をお勧めします。クライアントは、認可リクエストを開始するときにstateパラメーターの値を設定し、その値をユーザーのセキュアなセッションに保存する必要があります。client_idclient_secretとは異なり、stateパラメーターは攻撃防止に備えて、認可リクエストごとに推測不可能な一意の値を割り当てる必要があります。クライアントと通信して認可コードとアクセストークンを提供するとき、認可サーバーは同じstateを返します。返されたstateパラメーターの値が最初の呼び出しと一致しない場合は、攻撃からユーザーを保護するため、クライアントは通信を無視する必要があります。

stateパラメーターの計算

クライアントは任意の方法でstateパラメーターの値を計算できますが、フォージェリから保護できる値にする必要があります。Login with Amazonでは、少なくとも256ビットのエントロピーで安全に生成されたランダムな文字列の使用をお勧めします。この方法でstate値を計算する場合、暗号化処理に適した乱数ジェネレーターを使用します。

Pythonでの例を以下に示します。

def generate_state_parameter():
random = os.urandom(256)
state = base64.b64encode(random)
return (state)

stateパラメーター値を生成したら、ユーザーのセッション情報に保存します。こうすることで、情報を安全にやり取りし、セキュアなセッションに確実に保存できます。stateが認可レスポンスで返されたら、セッションに保存されているstate値と較して、ユーザーの正当性を検証します。値が一致しない場合は、認可レスポンスを無視します。

また、stateパラメーターの値を使用して認証後にユーザーを動的にリダイレクトする場合は、安全に生成したランダムな文字列と動的URLをスペースで区切って連結する方法を検討してください(例:state = state + " " + dynamicURL)。認可サーバーがstateを返したら、それを解析し、スペースの前後で2つの値に分けます。2番目の値には、認証後にユーザーを適切なページにリダレクトするための動的URLが入ります。