2011-02-16 98 views
0

起初,我想出了下面来看看保持登录到我的网站的用户,如果用户已经登录:如何使用PHP会话cookie

<?php 
    session_start(); 
    if(!isset($_SESSION['sessionid'])) { 
    header("Location: login_form.php"); 
    } else { 
    echo "You are logged in"; 
    } 
?> 

$_SESSION['sessionid']当用户手动登录设置。

如果用户选中“记住我”我设置会话cookie的生命周期为10年:

$lifetime = 24*60*60*365*10; // 10 years 
    setcookie(session_name(),session_id(),time()+ $lifetime,'/'); 

所以现在我需要弄清楚如何在服务器端做....在当然,我正在考虑将session.gc_maxlifetime设置为很高的值,以便服务器的会话数据可以长时间存在,但是10年将会很荒谬。现在我想我应该将会话ID存储在用户表中,并根据会话ID查询该ID。如果有匹配,我会自动登录用户。

我的问题是: 如何从客户端获取会话ID?

我的理解是,在我调用session_start()之后它将可用,但仅在服务器的会话数据仍可用时才可用。如果会话已过期(这取决于session.gc_maxlifetime的值),则会在调用session_start()时生成新的会话标识。这会有问题,因为它不会匹配我存储在用户表中的最后一个会话ID。

所以想法我要读会话ID,呼吁在session_start()之后是: 1)$_SESSION['sessionid'] 2)$id = session_id(); 3)如果服务器已经摧毁$_COOKIE["PHPSESSID"];

1和2将无法正常工作会话数据,所以我不认为我可以使用这些。

3可能会奏效,但是当我试图(echo $_COOKIE["PHPSESSID"];)我很惊讶,因为会话ID是出现了两次: 输出是这样的:

htknitopug4b6bv4ql9050pfg6 //htknitopug4b6bv4ql9050pfg6 

我只是希望可以将输出为htknitopug4b6bv4ql9050pfg6.

任何人都可以解释会话ID的重复条目?如果这种行为是一致的,我总是可以将第一个字符串读入我的数据库表中。

+1

我建议你给[这个答案](http:// stackoverflow。com/questions/5009685/encoding-cookies-so-they-can-be-spoofed-or-read -etc/5009903)#5009903)阅读。总之,你不应该那样做...... – ircmaxell 2011-02-16 19:24:34

回答

2

简短的答案是,你不应该那样做。有关原因,请参阅this answer

至于怎么做,我会设置一个签名的cookie(该帖子显示了如何)与每个用户唯一的一个大的随机字符串。然后,如果新会话加载会话,请检查cookie。然后根据该随机字符串查找用户。如果你找到一个,悄悄地登录用户回来。

这是一个非常标准的记忆我功能,但它避免了长时间运行的会话,或使用其他事情的会话标识符的坑。

有一点需要注意,你真的应该经常旋转你的会话标识符。我通常会为每个登录/注销事件以及每当用户做出敏感的事情(管理员表单,发布内容等)时执行此操作。旋转太多没有错......