1

我在 PHP 5.3 上运行了 15-10 年的多个系统,我无法继续这些系统并进行任何更改。

问题是:其中一些系统使用的 PHPregister_globals = on在 PHP 5.3 上已经贬值,甚至在 PHP 5.4 中都不存在(http://php.net/manual/en/security.globals.php)。

我正在开发一个新系统,想转 PHPregister_globals = off但我不能,因为所有那些需要它的旧系统。

所以我考虑在我的脚本中使用动态更改register_globalsto但是文档(http://php.net/manual/en/function.ini-set.php)让我有点困惑:offstring ini_set ( string $varname , string $newvalue )

设置给定配置选项的值。配置选项将在脚本执行期间保留此新值,并将在脚本结束时恢复。

这是否意味着如果我有两个脚本同时运行,让我们说......我的一个真正需要的旧系统register_globals = on和我使用旧脚本的新系统将使用新ini_set()更改register_globals = off的设置运行?或者它会将设置保留在我的 PHP.ini 文件中,并且新系统将在ini_set()配置上运行?

- 编辑 -

经过一些测试(见下面的代码)@Jacob 是正确的,似乎 PHP 为每个脚本创建了一个上下文,并且ini_set()只更改了脚本的配置。

TestWithIni_Set.php

<?php
ini_set('register_globals', '0');

$i = 0;
while(true)
{
    if($i == 0)
    {
        phpinfo();
    }
    $i++;
}
?>

TestWithoutIni_Set.php

<?php
phpinfo();
?>

所以我先跑了TestWithIni_Set.php,然后将TestWithIni_Set.php执行(无限的while循环)我跑了TestWithoutIni_Set.php

不幸的是,看起来我无法register_globalsini_set(). 我尝试了以下方法:

//Knowing that ini_set() parameters are strings I tried those anyway.
ini_set('register_globals', '0');
ini_set('register_globals', 0);
ini_set('register_globals', 'off');
ini_set('register_globals', 'Off');
ini_set('register_globals', false);
ini_set('register_globals', 'false');

然后为了确保我的代码没有问题,我尝试了:

ini_set('log_errors', '0');

只是想看看它是否会起作用并且确实有效。然后log_errors脚本ini_set()的值是关闭的,log_errors脚本的值ini_set()是打开的。

但现在我有一个不同的问题。

register_globals如果我不能使用 更改它,如何仅更改正在运行的脚本的值ini_set()

4

1 回答 1

0

我在我的新系统目录中添加了一个.user.ini文件,唯一的一行是register_globals=off.

我还取消了 PHP.ini 文件中以下行的注释:

user_ini.filename = ".user.ini"

我还确保只有本地用户有权更改该目录。所以有人不能在这个目录中为我的服务器上传一个新的用户定义 .ini 文件。

例如:IIS 用户只能读取此目录中的文件,不能添加/修改/删除任何文件。

于 2014-08-14T15:54:28.860 回答