0

对于一个项目,我正在创建一个 Web 应用程序,其中登录将是最重要的部分。不幸的是,我似乎无法让会话正常工作,所以登录根本不会持续。这是我在测试/实验/调试页面上编写的一些简单代码。

这是测试页面的头部。

<? 
if(!isset($_SESSION)){
    session_start(); 
}
?>
<!DOCTYPE html>
...

这是使用会话数据的代码。

$_SESSION[0] = $_SESSION[0] + 1;
echo($_SESSION[0]);

它应该随着每次访问而增加,但它并没有这样做,就像登录系统一样。

phpinfo()如果有帮助,这是该功能的会话设置。

Session Support enabled
Registered save handlers    files user sqlite
Registered serializer handlers  php php_binary wddx

Directive   Local Value Master Value 
session.auto_start  Off Off
session.bug_compat_42   On  On
session.bug_compat_warn On  On
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  100 100
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 4   4
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /tmp    /tmp
session.serialize_handler   php php
session.use_cookies On  On
session.use_only_cookies    On  On
session.use_trans_sid   0   0
4

4 回答 4

1

您不需要 !isset 来检查您的会话,只需调用 session_start(); 在处理会话变量的任何页面的顶部。

根级别的键必须是有效的标识符,因此 session[1] 不起作用,但 session['1'] 会。

会话文档中有一些有趣的限定词。

评论中还有一些更高级的示例:
如果您无法控制 register_globals 设置:(isset($_REQUEST['_SESSION']))。

于 2012-11-17T11:44:02.190 回答
0

取自PHP session_start 文档

session_start() 根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话。

因此,要使用基于 cookie 的会话,您应该始终session_start()在每个脚本的开头调用以恢复当前会话。不要检查$_SESSION,PHP 不会启动新会话,而是恢复当前会话。

于 2012-11-17T11:47:50.467 回答
0

我像这样设置我的会话-(它是安全的并且对我有用)

在登录页面上:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

// 或者只是$_SESSION['fingerprint'] = $login['id']// 将 ID 存储为会话(不安全)

(配置页面上定义的短语)

然后在整个站点其余部分的标题上:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}

然后使用你的session['fingerprint']

于 2012-11-17T11:50:20.840 回答
0

您能否详细说明您的问题。如果您在多个页面上不存在会话时遇到问题,那么您可能不会在每个页面上调用会话。据我所知,登录后工作的每个页面都必须单独调用会话

于 2012-11-17T12:15:47.253 回答