Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPで学ぶ Session の基本と応用 / web-app-session-101

PHPで学ぶ Session の基本と応用 / web-app-session-101

PHPerKaigi 2021 の登壇資料です。

Cookie を使った Session 管理について解説しています。

Ryo Tomidokoro

March 20, 2021
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Programming

Transcript

  1. @hanhan1978
    PHPで学ぶ
    Sessionの基本と応用
    PHPerKaigi 2021

    View Slide

  2. @hanhan1978
    ● 富所 亮
    ● 所属
    ○ 株式会社カオナビ
    ● 職業
    ○ Webアプリケーションエンジニア
    ● ブログ
    ○ https://blog.hanhans.net
    ● Yokohama North AM
    ○ https://anchor.fm/yokohama-north-am
    2

    View Slide

  3. 今日、発表すること
    3

    View Slide

  4. Session
    4

    View Slide

  5. Webアプリケーション開発者が
    Session と呼んでいるものは何か?
    5

    View Slide

  6. Session
    a period of time that is spent doing a particular activity
    特定の活動に費やされた期間
    https://www.oxfordlearnersdictionaries.com - Oxford Learner’s Dictionary 6

    View Slide

  7. Session
    → この単語だけだと曖昧
    7

    View Slide

  8. Cookie を使った Session 管理
    略して Session
    8
    本スライドでは以後、断りなく Session と表記した場合、
    「Cookie を使った Session 管理」を表します。

    View Slide

  9. 今日、覚えて帰って欲しいこと
    9

    View Slide

  10. ● 1章 「生い立ち」
    ● 2章 「技術的な仕組み」
    ● 3章 「最低限の周辺知識」
    10

    View Slide

  11. 1章 「生い立ち」
    11

    View Slide

  12. Cookieから始まった
    12

    View Slide

  13. Cookie とは何か?
    どういう用途で作られた物なのか?
    13

    View Slide

  14. World Wide Web
    1990 Nov : Tim Berners Lee
    1996 May : RFC 1945 (HTTP/1.0)
    → ステートレスなプロトコル
    https://en.wikipedia.org/wiki/World_Wide_Web 14

    View Slide

  15. ステートレス?
    15

    View Slide

  16. 「Webサーバーがアプリケーション
    状態を保存しない」制約
    Webを支える技術 (P80) - 技術評論社 16

    View Slide

  17. 状態(ステート)?
    17

    View Slide

  18. ● 何回アクセスがあった?
    ● ログインしているか?
    ● 前回アクセス時に何をカートに入れた
    18

    View Slide

  19. Webの普及に伴って
    状態を持ちたいという要求が高まる
    19

    View Slide

  20. Cookie
    1994 Oct : Mosaic Netscape (独自拡張)
    1997 Feb : RFC 2109
    2000 Oct : RFC 2965
    2011 Apr : RFC 6265
    https://en.wikipedia.org/wiki/HTTP_cookie 20

    View Slide

  21. https://tools.ietf.org/html/rfc6265 - HTTP State Management Mechanism
    Cookieとは
    ステートレスなHTTPで
    状態(ステート)を持つための技術
    21

    View Slide

  22. 22
    平たく言うと

    View Slide

  23. HTTPで
    ログインやお買い物カート
    を実現する技術
    💴
    23

    View Slide

  24. 24
    この章のおさらい
    HTTPはステートレス
    状態を持たせたいという欲求から
    Cookieが登場した

    View Slide

  25. 2章 「技術的な仕組」
    25

    View Slide

  26. まず、Cookieの仕組み
    26

    View Slide

  27. HTTP Response Header
    HTTP Request Header
    にCookie情報を含めて送る
    27

    View Slide

  28. Response Header
    にCookieを含める
    ※Webアプリケーション
    がセットした情報
    28

    View Slide

  29. HTTP Request Header
    29

    View Slide

  30. ブラウザとWebサーバーが
    仕様に従って Cookie を送受信する
    と表現されると聞こえがよいが...
    30

    View Slide

  31. ステートレスなHTTPに
    無理やりステートを入れ込んでいる
    31

    View Slide

  32. Cookieのデータ容量
    32

    View Slide

  33. 一度の Req/Res で 4KBまでの
    データしか扱えない
    → Headerに載せるという前提を考えれば当然の制約
    33

    View Slide

  34. 機微情報はHeaderで送受信したくない。
    → SSL/TLSが贅沢だった時代は特に。
    34

    View Slide

  35. Webアプリは、状態として大量の情報をも
    たせてくる
    例)ユーザ情報、Validation エラー、入力値、履歴...💰
    35

    View Slide

  36. そこで
    Cookieには鍵となるIDだけを保持
    → Webサーバー側でデータを保存する
    36

    View Slide

  37. 37
    鍵となるID

    View Slide

  38. 38
    初回アクセス

    View Slide

  39. 39
    二回目以降

    View Slide

  40. Cookie を使ったSession管理は分かった
    → プログラミング言語はどのようにサポートしているのか?
    40

    View Slide

  41. PHP において Session は拡張として入っ
    ている
    41

    View Slide

  42. デフォルトで有効
    --disable-session で 無効にすることも可
    42

    View Slide

  43. (余談)
    どんなときに Session 拡張を無効にする?
    A) どうまかり間違っても Session 使ってほしくない時とか??
    43

    View Slide

  44. Session 拡張無効だと、Laravel動かない
    44

    View Slide

  45. Session 拡張のマニュアル
    https://www.php.net/manual/en/ref.session.php 45

    View Slide

  46. a.php name という要素を追加
    b.php name要素を出力
    このような無邪気なソースコー
    ドで、簡単に利用することが可

    46

    View Slide

  47. $_SESSION (スーパーグローバル)
    https://www.php.net/manual/en/reserved.variables.session.php 47

    View Slide

  48. $_SESSION
    直接使うのは、相当訓練されたPHPer
    もしくは...
    48

    View Slide

  49. デフォルトのSession Store
    ファイル /tmp/sess_[session_id] 等
    余談)短時間に大量に出力すると、ほんの少しパフォーマンが落ちます
    49

    View Slide

  50. デフォルトの Session ID 名
    PHPSESSID
    session.name (php.ini)
    session_name 関数
    を使って変更可能
    50

    View Slide

  51. Set-Cookie で SESSION ID がセットされる
    51

    View Slide

  52. PHP の WAF が使う Session 実装
    52

    View Slide

  53. Symfony
    Http Foundation Component
    Drupal, Joomla, Laravel… 多数
    53

    View Slide

  54. PHP の $_SESSION, setcookie を
    安全に使うためのラッパー
    54

    View Slide

  55. Super Global を直接いじらないで!とい
    う願いが込められている(多分)
    55

    View Slide

  56. 56
    この章のおさらい
    Session ID をキーにして状態を保存
    PHPではデフォルトで利用可能
    ※ただし、安全のためにもWAFの利用が推奨される

    View Slide

  57. 3章 「最低限の周辺知識」
    57

    View Slide

  58. Session 管理のセキュリティ
    58

    View Slide

  59. 仕組の前提として
    Cookie が使われている
    59

    View Slide

  60. Cookie の正しい理解が不可欠
    60

    View Slide

  61. 61
    GoogleがセットするCookieの例

    View Slide

  62. Cookieの属性
    Max-Age
    Expires
    Domain
    Path
    Secure
    HttpOnly
    SameSite
    属性はCase Insensitive
    大文字小文字関係なし
    SameSiteは策定中の最新仕様だが、
    すでにブラウザ側は実装済
    62

    View Slide

  63. 特に大事な属性
    63

    View Slide

  64. Secure
    SSL/TLS通信でのみCookieを送信する
    盗聴対策
    64

    View Slide

  65. HttpOnly
    JavaScriptからはアクセス不可
    XSSで Cookie を盗ませない
    65

    View Slide

  66. WAFを使っていれば、この手のリスクは
    考慮されている
    オレオレFWの場合や、生PHPの場合は注意が必要
    66

    View Slide

  67. Session 管理を狙った攻撃
    67

    View Slide

  68. SESSION ID さえ盗めれば
    誰かになりすますことも可能
    68

    View Slide

  69. Session 固定化攻撃
    Session ハイジャック
    https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版
    69

    View Slide

  70. 設計されていない
    不用意なSESSION利用によるバグ
    70

    View Slide

  71. 例)保持された状態によって、本来のページ遷移がおかしくなる
    71

    View Slide

  72. バグの修正例
    そもそも状態を持たせたことが原因なので仕様自体を見直し
    てSessionを使わない形にしていくと良いかも
    72

    View Slide

  73. Session がセキュリティのために
    使われている例
    73

    View Slide

  74. CSRF Token
    74

    View Slide

  75. https://medium.com/@sachindilan/secure-software-development-synchronizer-token-pattern-9afe0cc92ba
    Synchronizer Token Pattern
    75

    View Slide

  76. Session 管理が
    アーキテクチャに与える影響
    76

    View Slide

  77. Session Store が File の場合
    77

    View Slide

  78. シングル構成なら問題ない
    78

    View Slide

  79. LoadBalancer を使うと Session Store が分散
    79

    View Slide

  80. 対策1
    共有の Session Store
    80

    View Slide

  81. 共有 Session Store
    81

    View Slide

  82. 対策2
    Sticky Session
    82

    View Slide

  83. LBが空気を読んで、ユーザ毎の到達エンドポイントを固定
    LBの機能なので、根本的な原因は解決されてない
    83

    View Slide

  84. 対策3
    Cookie を Session Store にする
    84

    View Slide

  85. 非推奨(すぐに4K越えます)
    あなたが思うより、すぐに越えます
    85

    View Slide

  86. 86
    この章のおさらい
    Cookieの仕様を理解
    Session 管理を狙った攻撃を把握
    Session ストアを設計時に考慮

    View Slide

  87. まとめ
    87

    View Slide

  88. 1. Session という単語を正しく覚える
    「Cookie を使った Session 管理」
    88

    View Slide

  89. 2. Cookie の仕様を理解する
    → RFC6265 を読んでみよう
    https://tools.ietf.org/html/rfc6265 89

    View Slide

  90. 3. Session管理の仕組を理解する
    90

    View Slide

  91. 4. Session 管理への攻撃を知る
    → 徳丸本読みましょう
    https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版
    91

    View Slide

  92. 5. アーキテクチャーを意識する
    → Session 管理のスケーラビリティ
    92

    View Slide

  93. @hanhan1978
    相談・指摘・その他 
    下記のTwitterアカウントにどうぞ
    93

    View Slide