未検証のURLへのリダイレクト

未検証のURLへのリダイレクト

説明

ユーザー入力をLocationヘッダーに使うと、信頼されているドメインを悪用して、ユーザーを悪意のあるサイトへ誘導できるおそれがあります。

想定される影響

フィッシングに利用される可能性があります。認証処理がこのリダイレクトを信頼している場合は、OAuthコードの窃取やアクセス制限の回避にもつながり得ます。

対処方法

サーバーが定義した内部パスを使うか、固定キーと許可リストで外部URLを選んでください。//で始まる外部ホストへのパスを内部パスとして扱わないでください。

例

変更前

php
<?php
header('Location: ' . $_GET['redirect']);

変更後

php
<?php
$next = ($_GET['redirect'] ?? '') === 'profile' ? '/profile' : '/';
header('Location: ' . $next);

説明:

  • 変更前: ユーザーが制御する値をリダイレクト先に使っています。
  • 変更後: サーバーが定義した内部パスを選びます。外部URLが必要な場合も、固定キーと許可リストで選んでください。//で始まる外部ホストへのパスは内部の移動先ではありません。

参考資料