この記事は以下の書籍を参考にして執筆しました。
クッキーとセッション管理
クッキー
クッキーはサーバ側からブラウザ側に「名前=変数」の組を覚えておくように指示する。
クッキーの発行
session_start()
この画面を表示させるとブラウザに以下のようなレスポンスが返る。
レスポンスヘッダのSet-Cookieにより、サーバはブラウザにクッキー値を覚えるように指示する。
以降、同じサイトにリクエスト送信するときにはこの覚えたクッキーを送信する。
有効期限がないクッキーはブラウザを閉じるまで有効。
セッションID
PHPSESSIDのクッキー値のこと
このセッションIDを$session[名前]
に格納しておく
クッキーは整理番号として使う
クッキーそのものに値を格納するは良くない。
セッションIDEAに求められる要件
要件1 第三者がセッションIDを推測できないこと
要件2 第三者からセッションIDを強制されないこと
要件3 第三者にセッションIDが漏洩しないこと
セッションID漏洩の原因
- クッキー発行の際の属性に不備がある。
- ネットワーク的に盗聴されてる。
- クロスサイトスクリプティングなどアプリの脆弱性で漏洩
- プラットフォームで漏洩
- Refererヘッダから漏洩
公衆無線LANは盗聴の可能性が高い。
セッションIDをネットワーク頭頂から保護するにはTLSによる暗号化が有効だがクッキーを発行する際の属性指定に注意がいる。
クッキーの属性
先のクッキーの発行には「path=/」があったがこれも属性の1種
属性一覧
属性 | 意味 |
---|---|
Domain | ブラウザがクッキー値を送信するサーバのドメイン |
Path | ブラウザがクッキーを送信するURLのディレクトリ |
Expires | クッキー値の有効期限。 |
Secute | HTTPSの場合のみクッキーを送信 |
HttpOnly | この属性が指定されたクッキーはjavascriptからアクセスできない |
Domain属性
クッキーはデフォでクッキーをセットしたサーバのみに送信される。
でも複数のサーバに送信されるクッキーを生成したい場合がある時にDomain属性が使える。
異なるドメインへのクッキー設定は出来ない
a.example.jpがSet-Cookie
の際にDomain=example.com
としてもブラウザでは無視される。
通常はDomain属性を指定しなものとおぼえておくといい
Secure属性
SecureをつけていないクッキーはHTTPS通信かどうかに関係なく常にサーバに送信される。
この属性はHTTPS送信を保証する目的で使用される。
HttpOnly属性
クッキーとして格納されたセッションIDを盗み出す典型としてクロスサイトスクリプティングでjavascriptで抜き出すがこの属性を指定すればjavascriptが使えなくなる。
完全には防げないが難しくできる。
これをつけていても悪影響はないためHttpOnly属性を杖kておくように知ればいい。
HttpOnly属性をつけるにはphp.iniで設定をする。
session.cookie_http_only = On
まとめ
- セッションの発行は
session_start()
でできる。これをするとブラウザのレスポンスとしてSet-Cookie
が設定される。 - セッション発行には属性がある。とりあえずDomain属性はつけずHttpOnly属性を設定しておくようにすればいい