セッション情報が上書きされる
created: 2009-03-02 18:33 | modified: 2009-03-04 00:52 | reply: 4
[4264] セッション情報が上書きされる - pyon - 2009-03-02 18:33- [4265] Re.セッション情報が上書きされる - ゆうじ - 2009-03-03 00:47
- [4266] Re.セッション情報が上書きされる - pyon - 2009-03-03 10:40
- [4267] Re.セッション情報が上書きされる - ゆうじ - 2009-03-03 19:47
- [4268] セッションの上書きを再現出来るパターン - ゆうじ - 2009-03-04 00:52
[4265] Re.セッション情報が上書きされる
user: ゆうじ | created: 2009-03-03 00:47
こんばんわ。
Win2000SP4、Apache2.0.63、PHP5.2.9、Mysql4.1.22 環境で
自作のセッションハンドラで再現するか試してみました。
sess1.php をリクエストすると
$_SESSION['test']を'テスト文字列'で初期化して
sess2.php にリダイレクトします。
sess2.php で $_SESSION['test'] を表示するものです。
このコードだと sess2.php で 'テスト文字列' が表示されてるので
リダイレクトそのものが原因とは考えにくいです。
セッションが保存されるタイミングに問題があるかもしれません。
リダイレクトの前に session_write_close() を
呼んでみるとどうでしょうか。
現象を再現できる最小限のコードを挙げてもらえれば
こちらでも試してみます。
mySession.php
sess1.php
sess2.php
Win2000SP4、Apache2.0.63、PHP5.2.9、Mysql4.1.22 環境で
自作のセッションハンドラで再現するか試してみました。
sess1.php をリクエストすると
$_SESSION['test']を'テスト文字列'で初期化して
sess2.php にリダイレクトします。
sess2.php で $_SESSION['test'] を表示するものです。
このコードだと sess2.php で 'テスト文字列' が表示されてるので
リダイレクトそのものが原因とは考えにくいです。
セッションが保存されるタイミングに問題があるかもしれません。
リダイレクトの前に session_write_close() を
呼んでみるとどうでしょうか。
現象を再現できる最小限のコードを挙げてもらえれば
こちらでも試してみます。
mySession.php
<?php
/**
* Table `mysess`
*
CREATE TABLE `mysess` (
`sessid` varchar(50) NOT NULL default '',
`value` blob,
`time` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`sessid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/
/**
* mySession: Session handler
*/
class mySession
{
protected $db = null;
public $tableName = 'mysess';
public $keyName = 'sessid';
function __construct ()
{
$this->db = mysql_connect('localhost', 'username', 'password');
if (mysql_error() || !is_resource($this->db))
return;
mysql_select_db('mydbname', $this->db);
if (mysql_error($this->db))
return;
}
function open ( $save_path, $session_name )
{
if (is_resource($this->db))
return true;
else
return false;
}
function close ()
{
return true;
}
function read ( $sessid )
{
$lifetime = time() - 1800;
$sql = "select * from `".$this->tableName."`where `".$this->keyName."` = '".mysql_escape_string($sessid)."' and `time` > ".$lifetime;
$results = mysql_query($sql, $this->db);
if (mysql_error($this->db) || !is_resource($results) || !mysql_num_rows($results))
return '';
$record = mysql_fetch_assoc($results);
if (!isset($record['value']) || !strlen($record['value']))
return '';
return $record['value'];
}
function write ( $sessid, $value )
{
$time = time();
$sql = "replace into `".$this->tableName."` set `".$this->keyName."` = '".mysql_escape_string($sessid)."', `value` = '".mysql_escape_string($value)."', `time` = ".$time;
mysql_query($sql, $this->db);
if (mysql_error($this->db))
return false;
else
return true;
}
function destroy ( $sessid )
{
$sql = "delete from `".$this->tableName."` where `".$this->keyName."` = '".mysql_escape_string($sessid)."'";
mysql_query($sql, $this->db);
if (mysql_error($this->db))
return false;
else
return true;
}
function gc ( $maxlifetime )
{
$lifetime = time() - $maxlifetime;
$sql = "delete from `".$this->tableName."` where `time` < ".$lifetime;
mysql_query($sql, $this->db);
if (mysql_error($this->db))
return false;
else {
mysql_query("optimize table `".$this->table_name."`", $this->db);
return true;
}
}
}
?>sess1.php
<?php
require_once 'mySession.php';
$sessHandler = new mySession;
session_set_save_handler (
array(&$sessHandler, 'open'),
array(&$sessHandler, 'close'),
array(&$sessHandler, 'read'),
array(&$sessHandler, 'write'),
array(&$sessHandler, 'destroy'),
array(&$sessHandler, 'gc')
);
session_start();
$_SESSION['test'] = 'テスト文字列';
header('Location: http://localhost/sess2.php');
exit();
?>sess2.php
<?php
require_once 'mySession.php';
$sessHandler = new mySession;
session_set_save_handler (
array(&$sessHandler, 'open'),
array(&$sessHandler, 'close'),
array(&$sessHandler, 'read'),
array(&$sessHandler, 'write'),
array(&$sessHandler, 'destroy'),
array(&$sessHandler, 'gc')
);
session_start();
if (array_key_exists('test', $_SESSION)) {
echo $_SESSION['test'];
} else {
echo 'Empty session';
}
exit();
?>