为什么codeigniter & Linux服务器在用户尝试登录时抛出unserialize()会话数据错误

5ktev3wc  于 2022-12-07  发布在  Linux
关注(0)|答案(1)|浏览(84)

我正在使用CodeIgniter开发一个应用程序,我已经在Linux服务器上部署了这个应用程序,我面临的问题是这个错误ERROR - 2022-01-06 11:48:16 --> Severity: Notice --> unserialize(): Error at offset 122 of 167 bytes /var/www/htmlaplib_core/libraries/Session.php 740,它阻止任何用户登录,但在我的本地开发环境中,我没有得到这个错误,我试图在互联网上找到解决方案,但我仍然无法获得收集解决方案。
这是在部署期间导致问题的代码。

function _unserialize($data)
{
    
    $data = @unserialize(strip_slashes($data));
    if (is_array($data))
    {
        foreach ($data as $key => $val)
        {
            if (is_string($val))
            {
                $data[$key] = str_replace('{{slash}}', '\\', $val);
            }
        }

        return $data;
    }

    return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data;
}

我会感激你的任何帮助
尤其是这条线$data = @unserialize(strip_slashes($data));
这是@unserialize()之前的变量$data的输出

  • a:15:{s:10:"session_id";s:32:"aef2d2d8a8282132c6ebae6ccc4b94a8";s:10:"ip_address";s:3:"::1";s:10:"user_agent";s:114:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36";s:13:"last_activity";i:1641453560;s:9:"user_data";s:0:"";s:4:"LANG";s:2:"en";s:8:"identity";s:16:"admin@gmail.com";s:8:"username";s:16:"admin@gmail.com";s:5:"email";s:16:"admin@gmail";s:7:"user_id";s:1:"2";s:14:"old_last_login";s:10:"1641452323";s:14:"institution_id";s:1:"0";s:20:"employer_category_id";a:0:{}s:13:"user_group_id";s:1:"1";s:13:"employer_name";N;}
wgxvkvu9

wgxvkvu91#

问题很可能是由于无效的长度而导致某些无效的序列化数据。
解决此问题的方法是重新计算序列化数据中的物料数量以及这些物料的长度。

$recalculated_data = preg_replace_callback( '!s:(\d+):"(.*?)";!', function( $match ) {      
    return ( $match[1] == strlen( $match[2] ) ) ? $match[0] : 's:' . strlen( $match[2] ) . ':"' . $match[2] . '";';
}, $data );

unserialize( $recalculated_data );

此外,请避免在代码中使用@,因为这将阻止显示(重要的)警告。
有关序列化无效长度的详细信息:How to repair a serialized string which has been corrupted by an incorrect byte count length?

相关问题