Slide 1

Slide 1 text

© Cake.jp Co.Ltd. All Right Reserved.|Confidential 2023/12/13
 
 Sessionの衝突から学んだ
 PHPのSession作成方法
 
 中村隼人


Slide 2

Slide 2 text

2 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 自己紹介 ● 名前 ○ 中村 隼人 ● 業務 ○ カート周り(PHP/Kotlin/TypeScript) ● おすすめ🍰 ○ 毎月タイムセールやってるから買ってね ! ○ 今これ食べてます!

Slide 3

Slide 3 text

3 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 話す ● PHPのSessionIDの作成方法 話さない ● 暗号アルゴリズム ● Sessionを使ったプログラムの書き方 ● C言語の読み方 今日話すこと/話さないこと

Slide 4

Slide 4 text

4 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 数秒間で複数回のエラーが発生。 CSからお客様の注文が完了しないという問い合わせが入る。 ある日のこと

Slide 5

Slide 5 text

5 © Cake.jp Co.Ltd. All Right Reserved.|Confidential ・ユーザとDBデータの紐づけにSessionIDを使っていた。 ・過去(5年前)に生成したSessionIDと現在のSessionIDに衝突が発生した。 ・サービスのコア部分、かつPHP本体への対応が必要だったため、対策方法が難しい。 原因

Slide 6

Slide 6 text

6 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 32種類の文字列が26桁 → 1.361129468E+39 → 約136澗(かん) 再現率を調べてみた

Slide 7

Slide 7 text

7 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPのセッション作成について

Slide 8

Slide 8 text

8 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPのセッション作成について

Slide 9

Slide 9 text

9 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPのセッション作成について

Slide 10

Slide 10 text

10 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHPのセッション作成について 弊社はPHP5.6を使用していた

Slide 11

Slide 11 text

11 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHP5.6でのSession作成方法

Slide 12

Slide 12 text

12 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHP5.6でのSession作成方法 Unixタイムスタンプの取得 接続元IPアドレス + 時刻 + 乱数 (基本的には数値のみが入る)

Slide 13

Slide 13 text

13 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHP5.6でのSession作成方法

Slide 14

Slide 14 text

14 © Cake.jp Co.Ltd. All Right Reserved.|Confidential PHP5.6でのSession作成方法 128bitのバイナリを文字列化(0-9a-v)

Slide 15

Slide 15 text

15 © Cake.jp Co.Ltd. All Right Reserved.|Confidential OSに用意されている暗号学的にセキュアでランダムな文字列の生成を行っている。 一方のPHP7.1以降では

Slide 16

Slide 16 text

16 © Cake.jp Co.Ltd. All Right Reserved.|Confidential ある日解決は突然に

Slide 17

Slide 17 text

17 © Cake.jp Co.Ltd. All Right Reserved.|Confidential ● 得られた知見 ○ 最新版への追従は大事! まとめ

Slide 18

Slide 18 text

18 © Cake.jp Co.Ltd. All Right Reserved.|Confidential https://github.com/php/php-src/blob/4b8f72da5dfb201af4e82dee960261d8657e414f/ext/sessi on/session.c#L287-L434 https://www.php.net/manual/ja/function.session-create-id.php http://dsas.blog.klab.org/archives/52136166.html 参考資料