我一直在使用PHP会话,一切正常,它完全符合我的需要。
然后我开始进一步研究潜在的安全问题并发现:
http://phpsec.org/projects/guide/4.html
请注意,所有正在使用的是确定现有会话或新会话“状态”为:
session_start();
...然而我之前已经多次见过这种事:
<?php
if (isset($PHPSESSID))
{
session_start($PHPSESSID);
}else{
session_start();
};
?>
我曾假设这会在第二次调用时允许其他一些处理,或者它的逻辑允许会话以不同页面的相同会话ID重新启动,例如。
但是我已经认为普通session_start()
已经有逻辑来确定会话是否已在其他地方建立,因为它'知道'保留现有会话ID而不是发布新会话ID,除非它需要课程!
所以我测试了上面的内容,我根本无法使用它。
<?php
if (isset($PHPSESSID))
{
$oldsession = "On";
$newsession = "Off";
session_start($PHPSESSID);
}
else
{
session_start();
$newsession = "On";
$PHPSESSID = session_id( );
};
echo 'ClientSessionID : '.$PHPSESSID.'<br>';
echo 'Refreshed Session : '.$oldsession.'<br>';
echo 'New Session : '.$newsession.'<br>';
?>
要么我缺少某些东西,要么这段代码永远不会有效。即使会话被保留,$oldsession
也不会得到回声。我的结论是$PHPSESSID
上的测试永远不会有效。
所以我的问题是:假设样本测试代码在语法上是正确的,那么在调用session_start()
之前尝试预先确定会话“状态”是否合理?如果是这样你会怎么做呢?
正如文章所展示的,在会话开始后使用(假设的)结果会话变量是向不同方向发送代码的唯一方法,所以我认为这实际上是唯一的方法它
答案 0 :(得分:3)
看起来这篇文章是在2005年初写的,所以也许这篇文章假设register_globals
设置已经开启。早在PHP4中,它默认处于启用状态,但默认情况下已在PHP5中禁用。
要使您的代码正常工作,您需要明确使用$_GET['PHPSESSID']
或$_COOKIE['PHPSESSID']
,因为由于$PHPSESSID
被禁用,可能未设置全局变量register_globals
另请注意,会话名称并不总是“PHPSESSID”。这是默认值,但可以在session.name
server setting中进行更改,也可以在运行时使用session_name()
更改代码。
答案 1 :(得分:1)
session_start()
将回收活动会话(如果存在)。您可以使用以下代码段观察此行为:
<?php
session_start();
echo 'Current session ID: ' . session_id();
$_SESSION['previous_id'] = session_id();
session_regenerate_id();
echo '<br />Session ID on next execution: ' . session_id();
if(isset($_SESSION['previous_id']))
echo '<br />Session ID on previous execution: ' . $_SESSION['previous_id'];
?>
Wiseguy说其余的。
答案 2 :(得分:0)
你的if(isset($ PHPSESSID))没有检查你的想法。我不确定手边的语法......但试试这个:
<?php
if (isset(session_id($PHPSESSID)))
{
$oldsession = "On";
$newsession = "Off";
session_start($PHPSESSID);
}
else
{
session_start();
$newsession = "On";
$oldsession = "None";
$PHPSESSID = session_id( );
};
echo 'ClientSessionID : '.$PHPSESSID.'<br>';
echo 'Refreshed Session : '.$oldsession.'<br>';
echo 'New Session : '.$newsession.'<br>';
?>
我还在$ oldsession中添加了一个值,这样你就可以看到$ PHPSESSID没有“设置”。
希望有所帮助!
祝你好运!答案 3 :(得分:0)
谢谢Dae和Wiseguy,你的答案给了我所需要的提示,虽然你没有提到的是安全方面,这是我带来的主题。
在上下文中,我看到的例子无疑是遗留代码,当时register_globals默认切换为“on”,显然还没有更新。
代码现在无法工作的原因是出于安全原因,regsiter_globals已作为PHP中的默认设置关闭。从5.3.0开始,它已被弃用,我正在使用5.3.4
我正在研究的安全问题是一种方法,用于确定使用会话的用户是否是原始用户,而不是欺骗他们的会话的人,并且标题中可以提供一些信息(IP地址)甚至在你决定开始会议之前。
但我现在知道IP地址也可以被欺骗,因此我认为首先启动会话并(恢复任何先前设置的会话变量)在之后验证。
与原始文章一样!