やっとStrict Sessionがマージされました。8年越しです。... http://t.co/ZBuVTHunqy本日、PHP-5.5.2が公開されましたので、ChangeLogを確認したところ、確かに入っているようです。
— Yasuo Ohgaki (大垣靖男) (@yohgaki) August 5, 2013
8年越しのstrict sessionsのマージ、まことにおめでとうございます。PHP 5 ChangeLog より引用
- Sessions:
- Implemented strict sessions RFC (https://wiki.php.net/rfc/strict_sessions) which protects against session fixation attacks and session collisions.
さっそく、PHP-5.5.2をビルドして確認してみました。まずはデフォルトの状態(php.ini-productionを使用)。
確かに、session.use_strict_modeが追加されていますね。デフォルトはOffのようです。これは後方互換性に配慮したものでしょう。session.use_strict_modeを有効にするには、php.iniに下記を追加すればよいのでしょうね。
session.use_strict_mode = Onこれを設定して再度phpinfoを実行すると、下記の画面に。
いい感じです(当たり前か)。
さっそくこの状態で試してみましょう。スクリプトとして以下を用いました。
これを実行すると下記の表示になります。<?php session_start(); if (isset($_SESSION['counter'])) { $_SESSION['counter']++; } else { $_SESSION['counter'] = 0; } echo 'phpversion: ' . htmlspecialchars(phpversion()) . '<br>'; echo 'session_id: ' . htmlspecialchars(session_id()) . '<br>'; echo 'counter : ' . htmlspecialchars($_SESSION['counter']);
セッションファイルを見ると、確かに生成されています。phpversion: 5.5.2 session_id: i0h3ej9hcs6dd40sopac9pf483 counter : 0>
しかし、セッションクッキーとして違うIDが返ってきています(HTTPレスポンスの抜粋)。$ sudo cat /tmp/sess_i0h3ej9hcs6dd40sopac9pf483 counter|i:0;$
このため、新規にセッションを開始することができず、永遠にカウンタは 0 のままです。この状態で、PHPの下記の警告が表示されます。HTTP/1.1 200 OK Set-Cookie: PHPSESSID=7irqs0dkccnusq9ckjcnlmkn21; path=/ Content-Length: 74 Content-Type: text/html phpversion: 5.5.2<br>session_id: i0h3ej9hcs6dd40sopac9pf483<br>counter : 0
PHP Warning: session_start(): The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in /var/www/session.php on line 2ちなみに、session.use_strict_mode = Off (あるいは指定しない)の場合は、セッションは正常に使用でき、カウンターはインクリメントされます。そして、有効なセッションがある状態(セッションクッキーとセッションファイル名が一致している状態)では、session.use_strict_mode = On でもセッションは有効に使用できます。
まとめ
PHP-5.5.2にて、大垣さんの提唱されてきたstrict sessionsがマージされました。私の検証した範囲では、まだ不具合があり使えないようですが、私の環境に依存する問題かもしれませんので、PHP関係者が追試されることを希望します。このstrict sessionsにて、PHPのセッションアダプションが解消されるはずです。私は「PHPのセッションアダプションは重大な問題ではないが、ない方がよい」という認識でしたので、この改善を私は歓迎いたします。
現時点ではPHP5.3とPHP5.4にはstrict sessionsはマージされていないようですが、だから言ってこれらPHPのバージョンが脆弱だとまではいえないと考えます。
0 件のコメント:
コメントを投稿