[PHP-users 4404] [解決?]PHPlib使用時にURIに含まれるセッションIDについて

Tadashi Oh-Ya php-users@php.gr.jp
Fri, 21 Dec 2001 16:06:56 +0900


 はじめまして。
 おおやと申します。

 Debian GNU/Linux(Potato)で Apache+PHP4+PHPlib+PostgreSQL
の組み合わせを使用しております。
#Potatoですので、PHPlibのバージョンとしては古いと思います。
#phplib-7.3系です。

 PHP4ではありますが、PHPlibを使用してのセッション管理をしよう
と考えております。

 インストール後の動作確認中に、セッションIDの扱いについてよ
くわからない部分が出てきてしまいました。どなたかお知恵を貸し
ていただけましたら幸いです。

 一言で言うと"COOKIEモードにも関わらず、URIにセッションIDが
表れる"という問題です。

 下記に状況を記載しましたが、長文で読み難くなってしまいました。
 申しわけございません。

-----------------------------------------------------------------
行なった手順 ここから
-----------------------------------------------------------------
● PHPlibをインストール後に、 pages/index.php3 や、prepend.php3,
  local.inc などを適当な場所にcpして編集し、動作確認を行ないました。

● ブラウザ側でCOOKIEを受けつけるようにしてあるのですが、1回目
  のページ表示で、セッションIDがURIに出てきてしまいました。
   ReloadしてもこのセッションIDはURIから消えませんでした。
  例) ~hoge/index.php3?TEST_Session=126c0...df39e62 (32桁のID)

● URIとして、"?TEST_Session"と、そこから後ろを削除して、ブラウ
  ザに再度読みこませると、それ以降のReloadではセッションIDがURIに
  含まれなくなります。

● $sess->mode="get" で動いているのか、$sess->mode="cookie" で動い
  ているのかを確認するために、以下のコードを index.php3 に追加して
  みました。
   ついでに、その他の変数も確認するようにしました。

    //追加コードここから
    echo("<BR>sess->mode: " . $sess->mode . "<BR>");

    echo("<BR>QUERY_STRING: " . $QUERY_STRING . "<BR>");
    while(list($key, $val) = each($QUERY_STRING)){
      echo("$key => $val<BR>");
    }

    echo("<BR>HTTP_COOKIE_VARS: " . $HTTP_COOKIE_VARS . "<BR>");
    while(list($key, $val) = each($HTTP_COOKIE_VARS)){
      echo("$key => $val<BR>");
    }

    echo("<BR>HTTP_POST_VARS: " . $HTTP_POST_VARS . "<BR>");
    while(list($key, $val) = each($HTTP_POST_VARS)){
      echo("$key => $val<BR>");
    }

    echo("<BR>HTTP_GET_VARS: " . $HTTP_GET_VARS . "<BR>");
    while(list($key, $val) = each($HTTP_GET_VARS)){
      echo("$key => $val<BR>");
    }
    //追加コードここまで

● 追加したコードの動作結果は、下記となります。

    Reload this page to see the counters increment.
    Load a more complex example (login as kris, password test).
    Load the default auth example.
    Show your phpinfo() page.
    Logout and delete your authentication information.

    Per Session Data: 9 <--Reloadするとちゃんと増加する

    Per Session Data is referenced by session id. The session id is
    propagated using either a cookie stored in the users browser or
    as a GET style parameter appended to the current URL.

    Per Session Data is available only on pages using the feature
    "sess" in their page_open() call.

    sess->mode: cookie <--COOKIEで動作していると主張している

    QUERY_STRING: TEST_Session=8925cd9542eff6afc788ef2becaece59

    HTTP_COOKIE_VARS: Array
    TEST_Session => 8925cd9542eff6afc788ef2becaece59

    HTTP_POST_VARS: Array

    HTTP_GET_VARS: Array
    TEST_Session => 8925cd9542eff6afc788ef2becaece59

● 以上から、動作モードとしては、やはり $sess->mode="cookie" で
  動いていると判断しました。
   QUERY_STRING にセッションIDが表れていることから、QUERY_STRING
  をとっかかりに関数を追ったところ、session.inc 中の
    get_id()
    self_url()
    add_query()
    release_token()
  あたりが関係しているらしいと考え、これらをキーワードにgoogleで
  検索しました。

● googleの検索から、
    http://www.phpbuilder.com/mail/phplib-dev-list/2000071/0004.php
    http://www.phpbuilder.com/mail/phplib-dev-list/200002/0035.php
  で問題が解決されると判断し、local.inc中で関数をoverrideしてpatchを
  適用しました。
   主に 200002/0035.php を適用しました。

● 症状は完全には改善されませんでした。
   patch適用の結果、初回の表示でURIにセッションIDが含まれることに
  変化はありませんでしたが、2回目以降のReloadにはセッションIDは
  表示されなくなりました。

● patch適用を行なっていく中で、release_token() の中で self_url()
  がURIの表示を行なっていると考えました。
   そこで、release_token() 中で、$this->mode = $this->fallback_mode;
  として get モードに落ちている箇所をコメントアウトしてみましたが、
  PHPスクリプト全体が動作しなくなりましたので、これは却下しました。

● そこで、最終的に下記のようにlocal.inc中で url() をoverrideしま
  した。(このoverrideはgoogleの検索結果のpatchも含んでいます)
   このoverrideの意図は
  ・self_url() において、既にQUERY_STRINGが付加されている
  ・よって self_url() から呼ばれる url() 中では $sess->mode に関係
    なく、セッションID($this->id)を $url に付加しない
  となります。

  //local.inc中でのoverride ここから
  class TEST_Session extends Session {
    var $classname = "TEST_Session";
    略
    var $allowcache     = "no";

    function url($url){
      // Remove existing session info from url:
      if(strstr($url, $this->name) != false){
        $url = ereg_replace("&*" . $this->name . "=[[:alnum:]]+", "", $url);
      }
      // Remove trailing ?/& if needed
      $url=ereg_replace("[&?]+$", "", $url);

  //    switch($this->mode){
  //      case "get":
  //        $url .= (strpos($url, "?") != false ?  "&" : "?") .
  //                urlencode($this->name) . "=" . $this->id;
  //      break;

  //      default:
  //      ;
  //      break;
  //    }
      return $url;
    }
  }
  //local.inc中でのoverride ここまで

● url() のoverrideで、"COOKIEモードにも関わらず、URIにセッションID
  が表れる"という問題は解決することが出来たように感じます。
   ページの初回表示時からURIにセッションIDは含まれなくなりました。

● ここまでの作業で「Debian(Potato)で提供されるPHPlibに、local.inc
  で url() をoverrideしただけ」となりました。
-----------------------------------------------------------------
行なった手順 ここまで
-----------------------------------------------------------------

 一応問題は解決したかと思いますが、

・ なぜ release_token() の中で fallback_mode に落ちる必要が
  あるのか?

・ googleで出てきたように、問題そのものは既出と考えますが、
  そのものズバリの解決策がとうとう見付かりませんでした。
   他に適正な解決策はあるのでしょうか?
   url() をoverideするのは適切なのでしょうか?

といった点が疑問として残ってしまいました。
 どなたかご指導いただけましたら幸いです。
----------------------------------------------------------------------
おおや                                               toy@k-cable.co.jp
----------------------------------------------------------------------