PHP セッションIDの文字列の長さと文字種を変更してセキュリティ強度を上げる方法(※PHP 7.1.0 から利用可能)

php.ini のセッション関連の設定確認

サーバーによってデフォルトの設定内容は異なりますが、エックスサーバー(x10)の場合、セッションIDの文字数は「32」、文字の種類は「5」(0-9, a-v) になっています。

PHP 7.1.0 から文字列の長さを変更する「session.sid_length」と文字の種類を変更する「session.sid_per_character」が利用可能になりましたので、それぞれ設定して変更します。

セッション関連項目の抜粋(php.ini)

[Session]
 session.save_handler = files
 session.save_path = "/home/xxxx/xxxx.xsrv.jp/xserver_php/session"
 session.use_cookies = 1
 session.use_only_cookies = 1
 session.name = PHPSESSID
 session.auto_start = 0
 session.cookie_lifetime = 0
 session.cookie_path = /
 session.cookie_domain =
 session.serialize_handler = php
 session.gc_probability = 1
 session.gc_divisor = 1000
 session.gc_maxlifetime = 1440
 session.bug_compat_42 = 0
 session.bug_compat_warn = 1
 session.referer_check =
 session.entropy_length = 32
 session.entropy_file = /dev/urandom
 session.cache_limiter = nocache
 session.cache_expire = 180
 session.use_trans_sid = 0
 session.hash_function = 1
 session.hash_bits_per_character = 5
 session.use_strict_mode = 1

文字列の長さと文字種を変更

php.iniの場合

文字列の長さを変更

22 から 256 までの値が使えますが、今回は 64 と設定しました。

session.sid_length = 64

session.sid_length は、セッション ID 文字列の長さを指定します。 22 から 256 までの値が使えます。 デフォルトは 32 です。互換性を考慮するなら 32 や 40 などを使ってもかまいません。 セッション ID は長ければ長いほど推測されにくくなります。少なくとも 32 を指定することを推奨します。

https://www.php.net/manual/ja/session.configuration.php#ini.session.sid-length

文字種を変更

4 から 6 までの値が利用出来それぞれ利用する文字種が異なります。今回は 6 を設定しました。

session.sid_bits_per_character = 6
文字種
40-9, a-f
50-9, a-v
60-9, a-z, A-Z, “-“, “,”

session.sid_per_character エンコードされたセッション ID 文字のビット数を指定します。指定できる値は ‘4’ (0-9, a-f)、’5′ (0-9, a-v)、’6′ (0-9, a-z, A-Z, “-“, “,”) です。 デフォルトは 4 です。大きいほどセッション ID が強力になります。 大半のシステムでは、5 を推奨します。

https://www.php.net/manual/ja/session.configuration.php#ini.session.sid-bits-per-character

ini_set() の場合

ini_set() を利用しPHPコード内で変更することも可能です。

文字列の長さを変更

ini_set('session.sid_length', 64);

文字種を変更

ini_set('session.sid_bits_per_character', 6);

動作確認

変更前

デフォルトの session.sid_length = 32 / session.sid_bits_per_character = 5 の場合は、下記のようなセッションIDが生成されました。

string(32) "21fdc48c6f12025cc500489e81fb2e69"

変更後

session.sid_length = 64 / session.sid_bits_per_character = 6 に変更後は文字列の長さも文字種も変わり下記のようなセッションIDが生成されました。

string(64) "3ip9uScJirU51U3M,OfrAIJb41zXr1iJwHL1-3hX3MCk0Hpa4kvyxKux7,vw4d02"

確認用コード

<?php
// 32 から 64 に変更
ini_set('session.sid_length', 64);
// 5 から 6 に変更
ini_set('session.sid_bits_per_character', 6);

session_start();
var_dump(session_id());

動作環境情報

エックスサーバー(x10)
PHP7.2.17

コメント

タイトルとURLをコピーしました