繁体   English   中英

PHP 升级 5.2 到 5.3 Session 问题

[英]PHP Upgrade 5.2 to 5.3 Session Issue

我正在经历将服务器上的 PHP 从 5.2 升级到 5.3 的痛苦。 将我的旧 php.ini 迁移到新密码并升级我的 mysql 密码后,我的 PHP 会话不再有效。

这是我下面的登录代码,它可以正确执行,甚至可以在活动日志中正确记录我的登录。 (更新日志功能)我也贴出了我的 session 有效校验码。

我的登录代码中是否有任何明显的东西在 PHP 5.3 中不再有效,以前在 5.2 下工作过?

// 登录用户///

if(@$_POST["dologin"] == 1)
{
    //record login attempt
    updatelog("",$_SERVER['REMOTE_ADDR'],"Login Attempt By: ".$_POST['username']);

    $user_name = escape($_POST["username"]);
    $password = escape(md5(SALT.$_POST["password"]));

    $login = $query->GetSingleQuery("--SINGLE","SELECT user_name, id, user_email FROM url_users WHERE user_name='".$user_name."' and user_password='".$password."';",array("user_name","id","user_email"));

    if(!isset($login['user_name'])) //failed login
    {
        $_SESSION['loggedin'] = 0;
        //record failure
        updatelog("",$_SERVER['REMOTE_ADDR'],"Login Failure By: ".$_POST['username']);
        header("Location: index.php?failed=1&user=$user_name");
    }else
    { 
    //login valid
    //get country details
    $getcountry = $query->GetSingleQuery("--SINGLE","SELECT geo_ip.ctry FROM admin_adfly.geo_ip geo_ip WHERE INET_ATON ('".$_SERVER['REMOTE_ADDR']."') BETWEEN geo_ip.ipfrom AND geo_ip.ipto;",array("ctry"));

    //set session items
        $_SESSION['country'] = $getcountry['ctry'];
        $_SESSION['username'] = $login['user_name']; 
        $_SESSION['userid'] = $login['id']; 
        $_SESSION['loggedin'] = 1;
        $_SESSION['email'] = $login['user_email'];
    //session salt
        $hsh = md5($_SERVER['HTTP_USER_AGENT'].SALT);
        $_SESSION['_XXX(*@#!_D@R*&$%(){*@)_D_296']['user_agent'] = $hsh;

    //update the ui transaction log
        updatelog($login['id'],$_SERVER['REMOTE_ADDR'],"Login Success For: ".$_POST['username']);

        // run function to check if any adverts have completed
        adcomplete($_SESSION['userid']);

    //redirect
        header("Location: index.php");
    }

}

// 检查用户登录 session 是否有效,这在我想通过登录限制的每个页面上调用。 ////

if(isset($_SESSION['_XXX(*@#!_D@R*&$%(){*@)_D_296']['user_agent']) ==  $_SERVER['HTTP_USER_AGENT'].SALT)
                {
                    return 1; //session success
                }else
                {
                    return 0; //session failure
                }   

登录检查不是检查用户代理和盐的hash,应该是:

if (isset($_SESSION['_XXX(*@#!_D@R*&$%(){*@)_D_296']['user_agent']) == md5($_SERVER['HTTP_USER_AGENT'].SALT))
{
    return 1; //session success
} else {
    return 0; //session failure
}

编辑:

由于问题仍然存在,并且似乎是 php 配置问题,我将尝试制作最简单的使用会话的 php 页面,并在 5.3 环境中试用,以确认它是 ZE1BFD762321E409CEE4AC0B6E 配置问题并使用简单页面测试 963CEE4AC0B6E尝试解决问题时的配置。

一个简单的 php 页面:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
session_start();

if (isset($_SESSION['views']))
    $_SESSION['views'] = $_SESSION['views'] + 1;
else
    $_SESSION['views'] = 0;

echo '<pre>';
var_dump(session_id()); // I should stay the same
var_dump($_SESSION); // I should start at 0 and increase
echo '</pre>';

简单的解决方案:Go 到 /var/lib/php 并将属性 777 设置为“会话”目录。

编辑:是的,我知道这不是推荐的解决方案,但它有效。 为了正确,您应该将所有者设置为 php、httpd 或 nginx - 我没有时间检查它应该是哪个

经过一番混乱,事实证明问题与最后一个 session 名称有关,它以某种方式使整个浏览器 session 无效,从 Z21D6F40CFB511982E457ZA 中删除所有数据。

$_SESSION数组中删除"(*@#!_D@R*&$%(){*@)_D_296"后,我的登录 session 再次开始工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM