LoginSignup
0
1

More than 3 years have passed since last update.

【PHP】クッキーとセッション管理

Last updated at Posted at 2020-07-28

この記事は以下の書籍を参考にして執筆しました。

クッキーとセッション管理

クッキー

クッキーはサーバ側からブラウザ側に「名前=変数」の組を覚えておくように指示する。

クッキーの発行

session_start()

出典:体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[リフロー版] 脆弱性が生まれる原理と対策の実践

この画面を表示させるとブラウザに以下のようなレスポンスが返る。

レスポンスヘッダの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で設定をする。

php.ini
session.cookie_http_only = On

出典:体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[リフロー版] 脆弱性が生まれる原理と対策の実践

まとめ

  • セッションの発行はsession_start()でできる。これをするとブラウザのレスポンスとしてSet-Cookieが設定される。
  • セッション発行には属性がある。とりあえずDomain属性はつけずHttpOnly属性を設定しておくようにすればいい

参考文献

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1