我在PHP 5.3上运行了多个系统,这些系统已经运行了15到10年,我无法继续使用这些系统并进行任何更改。
问题是:其中一些系统正在使用PHP register_globals = on
,它在PHP 5.3上已经过折旧,甚至在PHP 5.4(http://php.net/manual/en/security.globals.php)中也不存在。
我正在开发一个新系统并且想要转换PHP register_globals = off
但我不能,因为所有那些需要它的旧系统。
所以我考虑使用register_globals
在我的脚本中动态更改off
到string ini_set ( string $varname , string $newvalue )
,但文档(http://php.net/manual/en/function.ini-set.php)让我感到困惑:
设置给定配置选项的值。配置选项将在脚本执行期间保留此新值,并将在脚本结束时恢复。
这是否意味着,如果我同时运行两个脚本,请说...我真正需要register_globals = on
的旧系统和使用ini_set()
{{1}的新系统旧脚本将使用新更改的设置运行?或者它会保留我的PHP.ini文件中的设置,新系统将在register_globals = off
配置上运行吗?
- 编辑 -
经过一些测试(见下面的代码)@Jacob是对的,似乎PHP为每个脚本创建了一个上下文,而ini_set()
只改变了脚本的配置。
TestWithIni_Set.php
ini_set()
TestWithoutIni_Set.php
<?php
ini_set('register_globals', '0');
$i = 0;
while(true)
{
if($i == 0)
{
phpinfo();
}
$i++;
}
?>
所以我首先运行了<?php
phpinfo();
?>
,然后TestWithIni_Set.php
正在执行(无限循环)我运行了TestWithIni_Set.php
。
不幸的是,我发现我无法使用TestWithoutIni_Set.php
更改register_globals
值。我尝试了以下方法:
ini_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
的值?
答案 0 :(得分:0)
我在我的新系统目录中添加了.user.ini
文件,唯一的一行是register_globals=off
。
我还在PHP.ini文件中取消注释以下行:
user_ini.filename = ".user.ini"
我还确保只有本地用户才有权对该目录进行更改。因此,有人无法在此目录中为我的服务器上传新的用户定义.ini文件。
例如:IIS用户只能读取此目录中的文件,无法添加/修改/删除任何文件。