スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ログイン処理における正しいCOOKIEの取り扱い

俺がPHPを学んだ本にはログイン処理をするにはセッションとCookieを併用するのがいいと書いてあった。
簡単にまとめるとこう。

■ログインの基本
1. セッションの使い方
ユーザがID/PWを入力、DBのそれと照合、正しければセッションIDを発行、セッションIDを持っていればログイン完了
→ただし、セッションはブラウザを閉じると削除される

2. Cookieの使い方
セッションIDが発行されたらブラウザにその情報をCookieとして保持、次回サイト訪問時にセッションIDを持っていなければ(ログインしていなければ)Cookieから取り出してセッションIDをセットする、セッションIDを持っていればログイン完了


上記はセッションIDと言っているが、これはユーザ名とかでもいい。
即ち、ID/PWが正しければユーザー名をセッションで保持、同じものをCookieにも保持し、ユーザー名がセッションまたはCookieから確認できればログイン、と言う流れ。


■脆弱性
でも上記の方法は脆弱性がある。
前提として「Cookieは覗けるし、書き換えもできる」ということを念頭に置かなければいけない。
仮にユーザー名をCookieに保持し、それがあればログインさせるというシステムにした場合、ユーザー名さえわかれば誰でもログインできるという構造になってしまう。
ではID/PWのペアをCookieに保持するのはどうか?
これなら他人にログインされる可能性は低くなるが、Cookieにパスワードのような重要な情報を保持するのはリスクが高いので避けた方がいい。


■解決策1(ダメな方法)
・手法
ログインに成功したらランダムな文字列を発行して、その文字列をキーとしてCookieに保持する。
また、そのキーはユーザーテーブルにも同様に保持しておく。
セッションが切れたユーザーが再度サイトを訪れた時、Cookieに保持されているキーと、ユーザーテーブルに保持されているキーを照合して同じであればログインさせる。そしてこのキーを一度削除し新たなキーをCookieとDBに保持し直す。

・ダメなポイント
キーを使った方法は一見堅牢性が高くてスマートなシステムに思えるが、致命的な欠陥がある。
複数台で同時にログインできない点だ。
端末Aがログインを終えてAAAという文字列をユーザーテーブルとCookieに保持。
その後端末Bがログインを終えてBBBという文字列をユーザーテーブルとCookieに保持。
このような状態の時、端末Aから再度サイトにアクセスした時、端末Aのブラウザが保持しているAAAというCookieとユーザーテーブルに保持されたBBBというキーは一致しない。


■解決策2(ましな方法)
・手法
ログインに成功したらランダムな文字列を「キーテーブル」に格納、同じ文字列をCookieにも保存する。
この方法だと端末AがAAAをキーテーブルとCookieに格納したあと、端末BがBBBをキーテーブルとCookieに格納してもきーテーブルにはAAA,BBB両方のキーが存在するので次回訪問時にどちらかが自動ログイン出来ないということはない。
また、キーを使ってログインしたらそのキーは廃棄して新しいキーを発行するように(キーは1回しか使えないように)すれば、さらにセキュリティレベルは上がる。




結局あれこれ考えるとCookieは使わないほうがいいというのが結論なのだが、そういうわけにも行かないのでなるべく利便性を保ちつつセキュリティレベルも下げない方法を選びたい。

コメント

コメントの投稿

非公開コメント

PR

PR

プロフィール

何でも書くman

Author:何でも書くman
思ったことや備忘録など、とりあえずなんでも書きます。IT系のことや趣味、生活に関わることなども。

ページの先頭へ戻る
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。