【发布时间】:2010-12-03 11:21:17
【问题描述】:
我正在我的 PHP 会话中测试安全检查的实现。我可以成功检测到会话是否从另一个 IP 地址启动,并且可以成功启动新会话。但是,旧会话中的数据会被复制到新会话中!如何在为其合法所有者保留先前会话数据的同时启动空白会话?
这是我迄今为止的代码,经过多次失败的尝试:
<?php
// Security check
if( isset($_SESSION['ip_address']) && $_SERVER['REMOTE_ADDR']!=$_SESSION['ip_address'] ){
// Check failed: we'll start a brand new session
session_regenerate_id(FALSE);
$tmp = session_id();
session_write_close();
unset($_SESSION);
session_id($tmp);
session_start();
}
// First time here
if( !isset($_SESSION['ip_address']) ){
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['start_date'] = new DateTime;
}
关于会话的官方文档非常混乱:(
更新:我发布了我通过反复试验获得的一些发现。他们似乎工作:
<?php
// Load the session that we will eventually discard
session_start();
// We can only generate a new ID from an open session
session_regenerate_id();
// We store the ID because it gets lost when closing the session
$tmp = session_id();
// Close session (doesn't destroy data: $_SESSION and file remains)
session_destroy();
// Set new ID for the next session
session_id($tmp);
unset($tmp);
// Start session (uses new ID, removes values from $_SESSION and loads the new ones if applicable)
session_start();
【问题讨论】:
-
@Álvaro G. Vicario - session_destroy ?php.net/manual/en/function.session-destroy.php 或 session_unregister - php.net/manual/en/function.session-unregister.php
-
@ajreal,你是对的:虽然 session_destroy() 这个名字暗示它会删除会话数据,但它没有。我正在测试它以找出它的确切作用。随意在答案中详细说明。
-
session_unregister() 已弃用,顺便说一句。
-
@Álvaro G. Vicario - 哎呀,5.3? ...还有一个,session_unset - php.net/manual/en/function.session-unset.php
-
@ajreal,不,5.2; 你在一小时前删除了标签:)