[PHP] セッション ID の桁数を増やしたい
ガム食ってたら前歯がちょびっと欠けたんですけど・・・!衝撃!どうもこんにちは nakamura です。
とある案件でセキュリティ上の理由からセッション ID をデフォルトよりも長くしたいなぁという事があり、そもそもそんなことできんのよか!?ってことで調べてみたところ、限界はあるものの一応方法が見つかったので今回はそのご紹介。というか、デフォルトのセッション ID の仕様が結構オソマツでびっくらこきました。
デフォルトの仕様
こんな感じ。
- 使用される乱数
IP アドレス、現在時刻、線形合同法による疑似乱数を組み合わせたもの - ハッシュアルゴリズム
md5 - 使用される文字列
0-9 a-f
使われる乱数がこの仕様だと WEB サーバが複数台あってアクセスがそれなりにあるサイトだと普通にセッション ID かぶることありそうですよね。
そもそも md5 ってあんまり良くないって言われてるし・・・(Wikipedia)。どうなのこれ??と正直思ってしまいます。
php.ini で変えられるよ
完璧ではないにしろ php.ini の設定である程度はマシにできるので、その辺りのディレクティブをご紹介。この辺りをさわります。(詳細はリンク先を見てね)
- session.entropy_file
元々の乱数にさらに付与する乱数のソースを指定。
デフォルト 空 - session.entropy_length
entropy_file から取得する乱数の長さを指定。
デフォルト 0 - session.hash_function
ハッシュアルゴリズムを指定。(0: md5, 1: sha1)
デフォルト 0 - session.hash_bits_per_character
ハッシュデータを文字列に変換する際、一文字に何ビット使うかを指定。
ここで使用される文字が決まります。
デフォルト 4
ということで、こんな感じにしてみました。
session.entropy_file = /dev/urandom
session.entropy_length = 2048
session.hash_function = sha1
session.hash_bits_per_character = 5
理屈で言うと 32 桁になるはずなんですが、なぜか 39 桁になった・・・。誰か分かる人いたら教えてください。とりあえずデフォルトのセッション ID よりはだいぶマシになったと思います。
終わりに
php.ini での変更は正直限界があるので、納得する形にしたければアプリ内にセッション ID 生成のロジックを持つのがベストだと思います。今回ご紹介したのはあくまで簡易的な方法なので、これで万全!とは思わないでくださいね。