PHP会话工作得非常好,但有些东西让我烦恼......

时间:2011-03-26 23:21:03

标签: php session

我一直在使用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()之前尝试预先确定会话“状态”是否合理?如果是这样你会怎么做呢?

正如文章所展示的,在会话开始后使用(假设的)结果会话变量是向不同方向发送代码的唯一方法,所以我认为这实际上是唯一的方法它

4 个答案:

答案 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地址也可以被欺骗,因此我认为首先启动会话并(恢复任何先前设置的会话变量)在之后验证。

与原始文章一样!