【发布时间】:2011-07-23 16:43:41
【问题描述】:
我一直在使用 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() 之前尝试预先确定会话“状态”是否合理?如果是这样,你会怎么做?
正如文章继续表明的那样,在会话开始后使用(假设的)生成的会话变量是向不同方向发送代码的唯一方法,所以我认为这实际上是唯一的方法它。
【问题讨论】:
-
代码中的
else块永远不会执行,因为 $PHPSESSID 的定义不会在页面刷新之间持续存在。 -
Else确实执行了,因为变量不会持续存在,即测试因您所说的原因而失败。 -
你是对的。我认为这就是 Dae 的意思,但只是误会了。
-
是的,谢谢 Wiseguy,很抱歉造成混乱。