忘れたい(切実)
経緯
PHP 5.4 以上でも register_globals と生きていくために - Thanks Driven Life
上記ポストで register_globals を再現する関数をご紹介しました。ですがこれらはあくまでも、いわゆる EGPCS にだけ対応していました。
というかそれで充分と思っていました。
ですが忘れていたのです。$_SESSION の存在を!
結論から言うと
session_start() 直後に
<?php foreach (array_keys($_SESSION) as $key) { $GLOBALS[$key] =& $_SESSION[$key]; }
こうすればいい
対象
- PHP 5.4 で セッションを扱う
register_globals = On前提のコードの守人たち
register_globals = On だと $_SESSION はどうなるの
PHP 5.3.29 の session.c をざっと眺めてみました。
- session_start() する
- ↑ の中で php_session_initialize() が呼ばれる
- ↑ の中で php_session_decode() が呼ばれる
- ↑ の中で PS_SERIALIZER_DECODE_FUNC(php_binary) もしくは PS_SERIALIZER_DECODE_FUNC(php) が呼ばれる
- at php-5.3.29/ext/session/session.c#L285
- どちらが呼ばれるかは、おそらく session.serialize_handler で決定しているはず。多分
- ↑ のどちらの中でも PS_ADD_VARL は呼ばれており、その実体は php_add_session_var() である
- ↑ の中で
$GLOBALSに変数をセットしていっている(リファレンス張ってる)
つまり
session_startすると- セッションデータをデコードして
- デコードして得られたデータ(key-value)を for で回し、
$GLOBALS[key] = valueとセットしていく- 正確には
$GLOBALS[$key] =& $_SESSION[$key]みたいな感じ
- 正確には
こんな感じです。
まとめ
がんばるぞい