5417
PHP のセッションID に独自の文字列を付加したいと思っています。

> **例）**  
>  _PHP が生成した元のセッションID が`eyJpdiI6Im05eWNZd2Q4dVwvbjlPc3I1S` であれば、`xx-` を付加して
> `xx-eyJpdiI6Im05eWNZd2Q4dVwvbjlPc3I1S` としたい。_

この目的のためにいくつかのセッション関連の関数を調べましたが、

  1. `session_regenerate_id()` は、新しいセッションIDを指定できないため NG
  2. `session_id()` は、`session_start() の前に呼ぶ必要があるため、現在のセッションID がわからずNG

となりだめそうです。`SessionHandler::create_sid` で自前でセッションID を作る方法は、残念ながら利用している PHP
のバージョンが合わず使えません。何かいいアイデアがありますでしょうか？
CC BY-SA 3.0
2015-01-27T08:09:07.103
5411
2015-01-27T14:20:28.343
2015-01-27T09:10:45.157
4978
7860
question
php sessionid
PHP のセッションID に、独自の文字列を付加したい
一度セッションを開始してセッション ID を取得し、その後、一度セッションを破棄してから セッション ID
を指定してセッションを開始する事で、お望みの動作が可能かと思います。

例えば、以下の様に行います。

```

    <?php
    
    define('SESSION_PREFIX', 'xx-');
    
    session_start(); // セッションを開始
    $sid = session_id(); // セッション ID を取得
    
    // セッション ID が SESSION_PREFIX で始まってなければ
    if (strpos($sid, SESSION_PREFIX) !== 0) {
        // session クッキーを削除
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params['path'], $params['domain'],
            $params['secure'], $params['httponly']
        );
    
        // セッションデータのバックアップ
        $sessionData = $_SESSION;
        // セッションを破棄
        session_destroy();
    
        // SESSION_PREFIX を付与してセッションIDを指定
        $sid = SESSION_PREFIX . $sid;
        session_id($sid);
    
        // セッションの再開
        session_start();
        // セッションデータのリストア
        $_SESSION = $sessionData;
    }
    
    $_SESSION['val'] = !isset($_SESSION['val']) ? 0 : $_SESSION['val'] + 1;
    
```

なお、自前でセッション ID を生成するには、以下の方法を用いることで暗号学的に安全な ID を生成できます。

## `openssl_random_pseudo_bytes()` 関数

```

    $id = bin2hex(openssl_random_pseudo_bytes(16));
    
```

[PHPマニュアル:
openssl_random_pseudo_bytes](http://php.net/openssl_random_pseudo_bytes)

## /dev/urandom

Unix 系 OS では、乱数を生成する擬似デバイスからIDを生成できます。

```

    $id = bin2hex(file_get_contents('/dev/urandom', false, null, 0, 16));
    
```

[Wikipedia: /dev/random](http://ja.wikipedia.org/?title=/dev/random)
CC BY-SA 3.0
2015-01-27T09:23:36.520
5417
2015-01-27T09:23:36.520
2944
5411
answer
SessionHandler::create_sidは5.4以降でしか利用できませんが、  
古くからあるsession_set_save_handler関数を利用して、  
セッションID生成時に任意の関数を設定出来ると思いますので、  
そちらを利用すると出来るのではないでしょうか

<http://php.net/manual/ja/function.session-set-save-handler.php>
CC BY-SA 3.0
2015-01-27T14:20:28.343
5441
2015-01-27T14:20:28.343
3104
5411
answer