Slide 1

Slide 1 text

@hanhan1978 PHPで学ぶ Sessionの基本と応用 PHPカンファレンス関西 2024

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

今日のテーマ 3

Slide 4

Slide 4 text

Session 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

1章 「生い立ち」 11

Slide 12

Slide 12 text

Cookieから始まった 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

ステートレス? 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

状態(ステート)? 17

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

22 平たく言うと

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

25 ちなみに

Slide 26

Slide 26 text

26 RFC 6265 今でも、Cookieに関する仕様の更新は行われており たくさんのドラフトドキュメントが作成されている

Slide 27

Slide 27 text

Cookies Having Independent Partitioned State (CHIPS) https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-00.html 27

Slide 28

Slide 28 text

追跡はできないが状態は参照できるという形 で3rd Party Cookieの問題点を解決する動き の一つ → Symfony は2023年10月に対応済み 28 あと10分かかる

Slide 29

Slide 29 text

2章 「技術的な仕組」 29

Slide 30

Slide 30 text

まず、Cookieの仕組み 30

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

HTTP Request Header 33

Slide 34

Slide 34 text

curl でも簡単に中身をチェックできる 34

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

ステートレスなHTTPに 無理やりステートを入れ込んでいる 36 Unixの時代から、コンピューター間でやりとりする小さい情報断片のことを cookie と呼んでいたらしい

Slide 37

Slide 37 text

ここで問題がでてくる 37

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

Cookieのデータ容量制限 39

Slide 40

Slide 40 text

一度の Req/Res で 4KBまでの データしか扱えない → Headerに載せるという前提を考えれば当然の制約 40 2024-03-10(訂正) Cookieのサイズについては RFC6265では定義されておらずブラウザの実装によります。 一般的には4KB〜数十KBとなっているようです。 いずれにしろ大きい容量でないことは確かです。

Slide 41

Slide 41 text

かつ機微情報をCookieに載せると盗聴リ スクがある → SSL/TLSが贅沢だった時代は特に。 41

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

43 鍵となるID

Slide 44

Slide 44 text

44 初回アクセス

Slide 45

Slide 45 text

45 二回目以降

Slide 46

Slide 46 text

Session ID を Cookieに設定すれば なりすましも可能 → いわゆるセッションハイジャック 最近は常時SSLなので難しいが...... 46

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

PHPのWAFが使うSession実装 59

Slide 60

Slide 60 text

Symfony Http Foundation Component Drupal, Joomla, Laravel… 多数 60

Slide 61

Slide 61 text

PHP の $_SESSION, setcookie を 安全に使うためのラッパー 61 2024-03-10(訂正) 「PHPのSessionHandlerInterfaceを実装したライブラリ」 が正しい表現です。 結果として $_SESSION もネイティブのsetcookieも使わないので 安全や確実性を企図したライブラリであることは間違いないです

Slide 62

Slide 62 text

Super Global を直接いじらないで!と いう願いが込められている(多分) 62 2024-03-10(追記) PHPデフォルトのSession操作系関数を使わないので、このスライドはいずれにしろ合ってい ます

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

Session 管理のセキュリティ 65

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

Cookie の正しい理解が不可欠 67

Slide 68

Slide 68 text

68 GoogleがセットするCookieの例

Slide 69

Slide 69 text

Cookieの属性 Max-Age Expires Domain Path Secure HttpOnly SameSite 属性はCase Insensitive 大文字小文字関係なし SameSiteはドラフト仕様だが、す でにブラウザ側は実装済 69

Slide 70

Slide 70 text

特に大事な属性 70

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

Session 管理を狙った攻撃 74

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

CSRF Token 81

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

Session Store が File の場合 84

Slide 85

Slide 85 text

シングル構成なら問題ない 85

Slide 86

Slide 86 text

LoadBalancer を使うと Session Store が分散 86

Slide 87

Slide 87 text

対策1 共有の Session Store 87

Slide 88

Slide 88 text

共有 Session Store 88

Slide 89

Slide 89 text

対策2 Sticky Session 89

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

対策3 Cookie を Session Store にする 91

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

まとめ 94

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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