[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
----------------------------------------------------------------------