在PHP中使用会话的最新,最好的做法和最简单的方法是什么?

时间:2008-09-18 20:18:39

标签: php session

自从上次使用PHP以来,PHP中的会话似乎发生了变化,所以我正在寻找一种简单的会话方式,但同时它也是相对安全的,也是一种很好的常见做法。

7 个答案:

答案 0 :(得分:3)

会话管理改变了一段时间(我认为它大约是4.4)。旧机制仍然有效,但已被弃用。它相当混乱,所以我建议保持清醒。今天,您通过访问全局变量$ _SESSION(它是一个数组)来使用会话。您可以 将对象实例放在那里,但是您需要在下一页开始会话之前加载这些对象的类定义。使用autoload可以帮助您。

您必须start a session才能使用$ _SESSION。由于开始会话发送标头,您之前不能有任何输出。这可以通过以下两种方式之一解决: 您始终在脚本开始时开始会话。或者您buffer all output,并在脚本末尾发送出去。

  

一个好主意是在每个请求上重新生成会话。这使得劫持的可能性大大降低。

这是(稍微)糟糕的建议,因为它可以使网站无法访问。只要用户权限发生变化,您应该regenerate the session-id。一般来说,这意味着,只要他们登录。这是为了防止会话固定(一种会话劫持形式)。有关此主题的更多信息,请参阅this recent thread @ Sitepoint

使用基于cookie的会话是可以的,但如果您在登录时重新生成会话ID,则不会添加任何额外的安全性,并且会降低可访问性。

答案 1 :(得分:2)

就简单性而言,它没有任何好处:

# Start the session manager
session_start(); 

# Set a var
$_SESSION['foo'] = 'whatever';

# Access the var
print $_SESSION['foo'];

答案 2 :(得分:1)

虽然数据库可能对会话更安全,但您应该首先关注您在会话中存储的内容 - 除了用于标识用户的ID之外,它不应该包含任何内容(并且可能是名字或临时名称)页面之间的变量)。

我建议只使用默认的cookie。数据库会话在每个页面上给予额外的打击,即使不是每个站点都是斜线,也不会像预先优化那样简单。

对于用法,我建议使用标准的全局变量:

$_SESSION['yourvar'] = 'somevalue';

如果您在所有代码中使用该方法,则可以稍后通过使用session_set_save_handler轻松更改后端,这提供了实现会话后端的统一方法。请注意,您可以使用一个对象来包含所有会话处理,只需为每个条目 - 数组('Staticclass','staticmethod')提供数组。

如需更深入的使用,我建议您查看KohanaPHP中如何处理会话。

答案 3 :(得分:0)

您可以将PHP会话存储在数据库中,如this中所述   书。我已经使用了这种方法,并且发现它安全且易于实现,所以我会推荐它。

答案 4 :(得分:0)

将$ SESSION数组封装在Session()对象中,该对象允许您以类似(但不可分离)的方式从会话,获取和发布中获取变量,包括自动安全过滤器,闪存变量(一次使用的var) distroyed)和默认值设置器。

在这一点上看看Symfony的行为,这非常有帮助。

答案 5 :(得分:0)

会话是我PHP知识的重要组成部分,因为它帮助我在开发第一个Web应用程序时解决了我的身份验证问题。

session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
    if( auth($_POST['username'], $_POST['password']) )
    {
        //Authentication passed
        $_SESSION['user'] = $_POST['username'];
        // redirect to required page
        header( "Location: index.php" );
    } 
    else 
    {
       //Authentication failed redirect to login
       header( "Location: loginform.html" );
    }
} 
else 
{
      //Username and Password are required
      header( "Location: loginform.html" );
}

答案 6 :(得分:-1)

首先,除非您有非常具体的商业理由,否则请仅使用基于Cookie的方式。我有一个客户端坚持基于url的会话只针对一个项目。非常不安全,也很痛苦。

一个好主意是在每个请求上重新生成会话。这使得劫持的可能性大大降低。例如。

session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();

另一个好的做法是,如果您正在进行某种用户登录作为系统的一部分,则在注销时完全无效并清空会话数据,以确保用户真正退出系统。我已经看到了通过删除会话cookie来完成注销的系统。

相关问题