php 如何修复session_register()过时的问题?

toiithl6  于 2023-01-29  发布在  PHP
关注(0)|答案(7)|浏览(114)

如何修复PHP 5.3中的session_register()过时问题

dkqlctbz

dkqlctbz1#

我为自己编写了一个小 Package 器,这样我就不必重写过去几十年的所有代码,它模拟register_globals和缺少的会话函数。
我从不同的来源获得了一些想法,并加入了一些自己的东西来替换缺少的register_globals和缺少的会话函数,这样我就不必重写过去几十年的所有代码,这些代码还可以处理多维数组,并从会话中构建全局变量。
要使代码正常工作,请在php.ini上使用auto_prepend_file指定包含以下代码的文件,例如:auto_prepend_file = /srv/www/php/.auto_prepend.php.inc
你应该已经安装了PECL的runkit扩展,并且在你的php.ini上有以下条目:

extension_dir = <your extension dir>
extension = runkit.so
runkit.internal_override = On

.汽车_prepend.php.inc:

<?php
//Fix for removed session functions
if (!function_exists('session_register'))
{
    function session_register()
    {
        $register_vars = func_get_args();
        foreach ($register_vars as $var_name)
        {
            $_SESSION[$var_name] = $GLOBALS[$var_name];
            if (!ini_get('register_globals'))
            {   $GLOBALS[$var_name] = &$_SESSION[$var_name]; }
        }
    }

    function session_is_registered($var_name)
    {   return isset($_SESSION[$var_name]); }

    function session_unregister($var_name)
    {   unset($_SESSION[$var_name]); }
}

//Fix for removed function register_globals
if (!isset($PXM_REG_GLOB))
{
    $PXM_REG_GLOB=1;
    if (!ini_get('register_globals'))
    {
        if (isset($_REQUEST))   { extract($_REQUEST); }
        if (isset($_SERVER))        { extract($_SERVER); }

        //$_SESSION globals must be registred with call of session_start()
        // Best option - Catch session_start call - Runkit extension from PECL must be present
        if (extension_loaded("runkit"))
        {
            if (!function_exists('session_start_default'))
            {   runkit_function_rename("session_start", "session_start_default"); }
            if (!function_exists('session_start'))
            {
                function session_start($options=null)
                {
                    $return=session_start_default($options);
                    if (isset($_SESSION))
                    {
                        $var_names=array_keys($_SESSION);
                        foreach($var_names as $var_name)
                        {   $GLOBALS[$var_name]=&$_SESSION[$var_name]; }
                    }
                    return $return;
                }
            }
        }
        // Second best option - Will always extract $_SESSION if session cookie is present.
        elseif ($_COOKIE["PHPSESSID"])
        {
            session_start();
            if (isset($_SESSION))
            {
                $var_names=array_keys($_SESSION);
                foreach($var_names as $var_name)
                {   $GLOBALS[$var_name]=&$_SESSION[$var_name]; }
            }
        }
    }
}
?>
fxnxkyjh

fxnxkyjh2#

我们只需要在这个被弃用的函数前面使用@。不需要像上面提到的那样做任何修改。例如:if(!@session_is_registered("username")){ }。只需输入@,问题就解决了。

kxe2p93d

kxe2p93d3#

别用它。说明书上写着:
在当前会话中注册一个或多个全局变量。
我想到了两件事:
1.使用全局变量并不好,想办法避免使用它们。
1.您仍然可以使用$_SESSION['var'] = "value"设置变量。
另请参见manual的警告:
如果你想让你的脚本在不考虑register_globals的情况下工作,你需要使用$_SESSION数组,因为$_SESSION条目是自动注册的。如果你的脚本使用session_register(),它将不能在PHP指令register_globals被禁用的环境中工作。
这一点非常重要,因为register_globals指令is set to False by default!
此外:
这注册了一个global变量。如果你想从函数中注册一个会话变量,你需要确保使用global关键字或$GLOBALS[]数组使其成为全局变量,或者使用特殊的会话数组,如下所述。
以及
如果使用的是$_SESSION(或$HTTP_SESSION_VARS),请不要使用session_register()session_is_registered()session_unregister()

irlmq6kh

irlmq6kh4#

**直接使用$_SESSION设置变量。**如下所示:

$_SESSION['name'] = 'stack';

代替:

$name = 'stack';
session_register("name");

Read More Here

dddzy1tm

dddzy1tm5#

PHP 5.3之前版本

session_register("name");

自PHP 5.3起

$_SESSION['name'] = $name;
sqyvllje

sqyvllje6#

如果你需要一个回退函数,你可以使用

function session_register($name){
    global $$name;
    $_SESSION[$name] = $$name;
    $$name = &$_SESSION[$name]; 
}
ruyhziif

ruyhziif7#

为了补充Felix Kling的答案,我正在研究一个代码库,它曾经包含以下代码:

if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        session_register($var);
    }
} else if (!(empty($start_vars))) {
    session_register($start_vars);
}

为了不使用session_register,他们进行了以下调整:

if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        $_SESSION[$var] =  $GLOBALS[$var];
    }
} else if (!(empty($start_vars))) {
    $_SESSION[$start_vars] =  $GLOBALS[$start_vars];
}

相关问题