php 中的 register_globals 错误

php 中的 register_globals 错误

我被错误困住了

directive 'register_globals' is no longer available in PHP in unknown on line 0

在 php.ini 文件中启用后,尝试使用“php -v”检查 php 版本register_globals。这样做并没有得到任何 php 版本信息。相反,它抛出了上述错误。关闭此选项后,php 信息工作得很好。对我来说,启用 register_globals 非常重要。我该如何纠正这个问题?

php.ini的如下:

; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
; http://php.net/request-order
request_order = "GP"

; Whether or not to register the EGPCS variables as global variables.  You may
; want to turn this off if you don't want to clutter your scripts' global scope
; with user data.
; You should do your best to write your scripts so that they do not require
; register_globals to be on;  Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
; 
register_globals = On

; Determines whether the deprecated long $HTTP_*_VARS type predefined variables
; are registered by PHP or not. As they are deprecated, we obviously don't
; recommend you use them. They are on by default for compatibility reasons but
; they are not recommended on production servers.
; Default Value: On
; Development Value: Off
; Production Value: Off
; 
register_long_arrays = Off

; This directive determines whether PHP registers $argv & $argc each time it
; runs. $argv contains an array of all the arguments passed to PHP when a script
; is invoked. $argc contains an integer representing the number of arguments
; that were passed when the script was invoked. These arrays are extremely
; useful when running scripts from the command line. When this directive is
; enabled, registering these variables consumes CPU cycles and memory each time
; a script is executed. For performance reasons, this feature should be disabled
; on production servers.
; Note: This directive is hardcoded to On for the CLI SAPI
; Default Value: On
; Development Value: Off
; Production Value: Off
;
register_argc_argv = Off

; When enabled, the SERVER and ENV variables are created when they're first
; used (Just In Time) instead of when the script starts. If these variables
; are not used within a script, having this directive on will result in a
; performance gain. The PHP directives register_globals, register_long_arrays,
; and register_argc_argv must be disabled for this directive to have any affect.
;
auto_globals_jit = On

答案1

来自文档

该功能自 PHP 5.3.0 起已被弃用,并自 PHP 5.4.0 起已被删除。

您可以降级 PHP,或者register_globals从 php.ini 文件中删除并修复引用它的任何代码。后者更可取。

答案2

指令注册全局变量从 PHP 5.3.0 开始已弃用,并从 PHP 5.4.0 开始删除(原因很简单:如果您没有创建高质量的代码,它很容易导致安全漏洞)

不能在 PHP 5.4 中不再启用 register_gobals 选项。因此,如果您确实需要在某些脚本中将所有变量注册为全局变量,则需要模拟旧行为:

创建脚本php5.4-workaround.inc.php

<?php
// workaround for register_globals PHP 5.4:

/**
 * function to emulate the register_globals setting in PHP
 * for all of those diehard fans of possibly harmful PHP settings :-)
 * @author Ruquay K Calloway
 * @param string $order order in which to register the globals, e.g. 'egpcs' for default
 */
function register_globals($order = 'egpcs')
{
    // define a subroutine
    if(!function_exists('register_global_array'))
    {
        function register_global_array(array $superglobal)
        {
            foreach($superglobal as $varname => $value)
            {
                global $$varname;
                $$varname = $value;
            }
        }
    }

    $order = explode("\r\n", trim(chunk_split($order, 1)));
    foreach($order as $k)
    {
        switch(strtolower($k))
        {
            case 'e':    register_global_array($_ENV);        break;
            case 'g':    register_global_array($_GET);        break;
            case 'p':    register_global_array($_POST);        break;
            case 'c':    register_global_array($_COOKIE);    break;
            case 's':    register_global_array($_SERVER);    break;
        }
    }
}
register_globals();
?>

在 Debian 上php.ini,如果您将脚本放在那里,则可以将其包含在您需要的所有脚本中include_path/usr/share/php

<?php include("/usr/share/php/php5.4-workaround.inc.php"); ?>

相关内容