My Photo

« 2013春アニメ感想 | Main | 猿の惑星:創世記 »

July 24, 2013

クッキーによるセッション管理

セッションIDに求められる要件

  1. 第三者が推測できないこと。
  2. 第三者からセッションIDを強制されないこと。
  3. 第三者にセッションIDが漏洩しないこと。

上記の要件を満たさないセッションIDを使用すると、セッションハイジャック(第三者によるなりすますこと)の危険性が増す。

1についてはセッションIDに使用する乱数の質が重要。
たとえば乱数でなく連番だったりすれば容易に推測される。また桁数が少なかったり乱数の作り方が悪くても推測される場合がある。

2については、認証した後にセッションIDを作り直す(PHPでは session_regenerate_id() を使用する)という対策がある。

bool session_regenerate_id ([ bool $delete_old_session = false ] )
パラメータ:
delete_old_session  関連付けられた古いセッションを削除するかどうか。 
返り値:
成功した場合TRUE。 

3の原因は以下のようなものがある。

  • クッキー発行の際に不備がある。
  • ネットワーク的にセッションIDが盗聴される。
  • クロスサイト・スクリプティングなどのアプリケーションの脆弱性により漏洩する。
  • セッションIDをURLに保持している場合は、Refererヘッダから漏洩する。

クッキーの属性

属性 意味
Domain ブラウザからクッキー値を送信するサーバのドメイン
Path ブラウザがクッキー値を送信するURLのディレクトリ
Expire クッキー値の有効期限。指定しない場合はブラウザの終了まで
Secure SSLの場合のみクッキーを送信
HttpOnly この属性が指定されたクッキーはJavaScriptからアクセスできない

setcookie()で上記の属性を設定できる。

bool setcookie(
    string $name [, string $value [, int $expire = 0
      [, string $path [, string $domain [, bool $secure = false 
        [, bool $httponly = false ]]]]]])

クッキーのDomain属性

Domain属性を設定しなければクッキーをセットしたサーバにのみクッキー値を送信する。これがもっとも安全である。原則としてDomain属性は指定しない。
Domain属性を設定した場合、Domain属性の値がURLのドメイン部分に後方一致する場合にブラウザはクッキーを送信する。例えばDomain属性が abc.jpの場合、abc.jp や xx.abc.jp に対してクッキーが送信される。
Domain属性を設定するのは複数のサーバにクッキー値を送らなければならない場はDomain属性を設定する。
セッションID固定化攻撃を防ぐため、異なるドメインに対するクッキー設定はできないように制限されている。例えばa.example.jpサーバがSet-Cookieで Domain=example.com としてもブラウザに無視される。

http://a.example.jp/test/cookie.php にブラウザでアクセスし
setcookie('TestCookie', 'abc', 0, '/test/', 'a.example.jp')
(Domain属性=a.example.jp, Path属性=/test/)
を実行した場合
→HTTPレスポンスヘッダに
Set-Cookie: TestCookie=abc; path=/test/; domain=a.example.jp
が含まれる。
この場合、クッキーの送信は以下のようになる。

domain属性=a.example.jp
URLの
ドメイン
URLの
パス
ブラウザからクッキーが
送信されるか
a.example.jp /test/index.html
a.example.jp /inde.html ×
example.jp /test/index.html ×
example.com /test/index.html ×

http://a.example.jp/test/cookie.php にブラウザでアクセスし
setcookie('TestCookie', 'abc', 0, '/test/', 'example.jp')
(Domain属性=example.jp, Path属性=/test/)
を実行した場合
→HTTPレスポンスヘッダに
Set-Cookie: TestCookie=abc; path=/test/; domain=example.jp
が含まれる。
この場合、クッキーの送信は以下のようになる。

domain属性=example.jp
URLの
ドメイン
URLの
パス
ブラウザからクッキーが
送信されるか
a.example.jp /test/index.html
example.jp /test/index.html
a.example.jp /index.html ×
example.jp /inde.html ×
example.com /test/index.html ×

http://a.example.jp/test/cookie.php にブラウザでアクセスし
setcookie('TestCookie', 'abc', 0, '/test/', 'example.com')
(Domain属性=example.jp, Path属性=/test/)
を実行した場合
→HTTPレスポンスヘッダに
Set-Cookie: TestCookie=abc; path=/test/; domain=example.com
が含まれる。
この場合、クッキーの送信は以下のようになる。

domain属性=example.com
URLの
ドメイン
URLの
パス
ブラウザからクッキーが
送信されるか
example.com /test/index.html ×
a.example.jp /test/index.html ×

クッキーモンスター問題

古いブラウザでは
・example.co.jpというドメインのサイトでドメイン属性がco.jpのクッキーを作ることができる。
・ドメイン属性が地域型ドメイン(例:yokohama.jp)のクッキーを作ることできる。
ものがある。
これはクッキーモンスター問題と呼ばれ、セッションID固定化攻撃に利用される可能性がある。

参考文献:体系的に学ぶWEBアプリケーションの作り方 3.1 HTTPとセッション管理

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

参考ページ:
Cookie仕様 日本語訳 - futomi's CGI Cafe

« 2013春アニメ感想 | Main | 猿の惑星:創世記 »

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

プログラミング、技術情報」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/57857287

Listed below are links to weblogs that reference クッキーによるセッション管理:

« 2013春アニメ感想 | Main | 猿の惑星:創世記 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof