2011-03-22 15 views
1

私は現在のログインシステムを使いますが、成功したログインの後に単にheader("Location: ".$_POST['url']);を使ってリダイレクトが実行されます。 $_POST['url']自体は、フォームがロードされるときに隠しフィールドの$_GET['url']パラメータから設定されます。

ご覧のとおり、ユーザーをハイジャックし、フィッシングサイトにログインする可能性があるという明らかな方法があります。

$_POST['url']からハイジャックを防ぐ簡単で簡単な方法はありますか?思考の最初のトレイルはbasename()のようなものですが、目的のページがディレクトリ内にあることがあるので、これはうまくいかないでしょう。

+0

ログインページのリダイレクト先をPOSTまたはGETで判断するのはなぜですか? –

+0

指定された元の場所です。たとえば、upload.phpを試してみると、login.php?url = upload.phpにリダイレクトされます。私はこれを設計しませんでしたが、私はそれを確保する必要があります:) – Dunhamzzz

答えて

4

ユーザーセッションでリダイレクトURLを設定し、ログインに成功した後にそのURLにリダイレクトする必要があります。この方法でURLをハイジャックすることはできません。

+0

あらかじめ定義された定数または構成変数も使用できます。 –

+0

華麗なもの。 – Dunhamzzz

3

私は最も安全な方法は、ドメイン名の後の部分だけを使用し、許可されているファイル/ディレクトリのホワイトリストを作成し、これらに対してチェックすることだと思います。

0

GET変数ではなく、そのコードを使用するPOST変数になります。しかし、どちらも相対的に簡単に偽造することができるという意味で、どちらも「安全」ではありません。渡される可能性のある値が懸念される場合は、何らかの方法で検証する必要があります。ごくわずかなURLしかない場合は、値がin_array()であるかどうかを確認し、そうでない場合はデフォルトの場所にリダイレクトしてください。

私はあなたが何が起こっているか心配しています。ユーザーはアドレスバーに任意のURLを入力するだけでしたか?別のURLに自分自身をリダイレクトすると何が良いでしょうかこれはのようですか?このソフトウェアがセキュリティのためにHTTP_REFERERに依存している場合を除き、安全ではないでしょう。

+0

攻撃者はログインページへのリンクを、ログインフォームの正確なコピーとなる可能性のあるフィッシングサイトにリダイレクトして送ることができますが、ユーザーは「再試行」メッセージを表示して、ログイン情報を攻撃者のWebサイト。 – Dunhamzzz

1

parse_url()を使用してPHP_URL_PATHPHP_URL_QUERY部分を取得し、相対パスにリダイレクトします。

しかし、リダイレクトリンクをセッションに格納する方がよいでしょう。

関連する問題