web-dev-qa-db-ja.com

セッションIDをurlパラメータとして渡すことが安全でないのはなぜですか?

私は最近、ディスカッションをフォローしました。ある人が、urlパラメータとしてセッションIDを渡すのは安全ではなく、代わりにCookieを使用する必要があると述べていました。他の人は反対を言って、そして例えばPaypalがセキュリティ上の理由のためにurlパラメーターとしてセッションIDを渡していると主張しました。

セッションIDをurlパラメータとして渡すのは本当に安全ですか?なぜクッキーはより安全なのですか?攻撃者は両方のオプション(cookiesとurlパラメータ)に対してどのような可能性がありますか?

59

セッションIDをurlパラメータとして渡すのは本当に安全ですか?

本質的に安全ではありませんが、コードが非常に適切に設計されていない限り、問題になる可能性があります。

お気に入りのフォーラムにアクセスしたとしましょう。ログインして、リクエストごとにセッションIDをURLに追加します。私は特に興味深いトピックを見つけ、URLをコピーして友達へのインスタントメッセージに貼り付けました。

アプリケーションがセッションIDにsome検証の形式があることを確認するための手順を実行していない限り、そのリンクをクリックした友人mayは私のセッションを継承し、私のように、私ができることは何でもしてください。

セッション識別子をCookieに保存することで、リンク共有の問題を完全に排除できます。

このテーマには セッション固定 と呼ばれるバリエーションがあり、これには意図的悪意のある目的でのセッション識別子の共有が含まれます。リンクされているWikipediaの記事では、この攻撃がどのように機能するか、およびnintentionalセッションIDの共有との違いについて詳しく説明しています。

なぜクッキーはより安全なのですか?

Cookie can通常のユーザーがコピーして貼り付けたり、表示して変更することはできないため、ここではより安全です。彼らははるかに安全なデフォルトです。

攻撃者は両方のオプションに対してどのような可能性がありますか?

どちらでもないこれらの方法は、暗号化されていない通信を介した中間者攻撃から安全です。ブラウザアドオン、スパイウェア、およびその他のクライアント側の悪意も、セッション識別子を格納する両方の方法をスパイできます。

どちらの場合も、セッションIDを所有していると主張するクライアントによるサーバー側の検証がベストプラクティスです。この検証の構成は議論の余地があります。企業プロキシの背後にいるユーザーは、リクエスト間でIPアドレス間をホップする可能性があるため、セッションをIPアドレスにロックすると、誤って人を疎遠にする可能性があることに注意してください。 セッション修正 の記事では、他のいくつかの役立つ代替案について言及しています。

76
Charles

ほとんどのWebサイトは、ユーザーのログイン状態をセッションに保存し、攻撃者がセッションIDを持っている場合は、ログインしているユーザーの権限も持っています。言い換えると、セッションの維持と認証の2つの懸念は、しばしば結びついています。

1つの問題は、 セッション固定 攻撃を行うのが簡単であることです。この場合、攻撃者は既知のセッションIDを持つ準備されたURLをユーザーに送信します。ユーザーがこのURLをクリックしてログインすると、攻撃者は特権を持つセッションを取得する可能性があります。ただし、WebサイトでCookieが必要な場合は、電子メールで準備されたURLでは不十分です。

サイトがHTTPSと混合されたHTTPを使用する場合、IDはすべてのHTTPリクエスト(画像リクエストであっても)のURLでプレーンテキストで送信されます。したがって、ユーザーがログインした後で攻撃者が1つのHTTPリクエストを読み取ることができる場合、攻撃者はセッションIDを知っています。

この問題を回避する方法は、セッションと認証の維持という2つの懸念を分離することです。次に、セッションを維持するためにのみセッションIDを保護せずに、別のCookieを使用してログイン状態を確認します。このCookieは、HTTPSページにのみ送信されるように構成する必要があります。

23
martinstoeckli

チャールズとマーティンが言ったことに加えて、URLに何かを入れると、URLがリークする可能性が高くなります。これは、リンクされたリソースのリファラーヘッダー、ブラウザーの履歴レコードを含むエンドポイントへのアクセス、ブルートフォースの履歴スニッフィング、不適切に保護されたWebログなどから発生します。そのため、URL /クエリ文字列に秘密にしたいものは何も入れないことをお勧めします。

PaypalがURLでサーバーセッションIDを使用するのを見たことはありません。本当にクッキーより安全な方法はありません。これが過去に一般的に行われた理由は、Cookieが有効になっていないブラウザをサポートするためでした。これは最近ますます問題になりません。また、リンクを共有しないというユーザビリティの問題に加えて、セッション固定攻撃に加えて、今日のセッションURLは通常回避されています。

15
bobince

数年前に私が見たのは、誰かがURL(sessionid付き)をTwitterにコピーしたことです。その後、すべてのフォロワーは、そのサイトの個人アカウントに完全にアクセスできました。

そのため、URLにsessionIDを含めることはお勧めできません。

7
Niels Basjes