经过漫长的质量保证流程,PHP 4.1.0 终于发布了!
[ 法语版本 ]
PHP 4.1.0 包含其他一些关键改进
正如一些人可能注意到的,这个版本具有相当的历史意义,因为这是我们历史上第一次实际递增中间数字!:) 造成这种前所未有变化的两个关键原因是新的输入接口,以及由于版本控制支持导致的模块二进制兼容性问题。
以下是新输入机制的描述。有关 PHP 4.1.0 中所有更改的完整列表,请参阅 ChangeLog。
首先,重要的是要强调,无论您在以下几行中阅读到什么内容,PHP 4.1.0 仍然支持旧版本中的旧输入机制。旧应用程序应该能够在无需修改的情况下正常工作!
现在我们已经解决了这个问题,让我们继续吧 :)
由于各种原因,依赖于 register_globals 处于打开状态的 PHP 设置(即表单、服务器和环境变量自动成为全局命名空间的一部分)经常在不同程度上容易受到攻击。例如,代码片段
<?php
if (authenticate_user()) {
$authenticated = true;
}
...
?>
可能会受到攻击,因为远程用户可以简单地将“authenticated”作为表单变量传递,即使 authenticate_user() 返回 false,$authenticated 实际上也会被设置为 true。虽然这看起来像是一个简单的例子,但实际上,相当多的 PHP 应用程序最终都因为与这个错误特性相关的问题而容易受到攻击。
虽然完全有可能在 PHP 中编写安全的代码,但我们认为 PHP 使编写不安全的代码变得过于容易,这一点很糟糕,因此我们决定尝试进行一项影响深远的更改,并弃用 register_globals。显然,由于世界上绝大多数 PHP 代码都依赖于此特性,因此我们目前还没有计划在可预见的将来将其从 PHP 中移除,但我们已决定鼓励人们在可能的情况下将其关闭。
为了帮助用户在关闭 register_globals 的情况下构建 PHP 应用程序,我们添加了一些新的特殊变量,可以用来代替旧的全局变量。有 7 个新的特殊数组
现在,除了这些变量包含这些特殊信息外,它们在另一个方面也很特殊 - 它们在任何作用域中都是自动全局的。这意味着您可以在任何地方访问它们,而无需首先“global”它们。例如
<?php
function example1()
{
print $_GET["name"]; // 可行,'global $_GET;' 不需要!
}
?>
可以正常工作!我们希望这个事实能够稍微减轻将旧代码迁移到新代码的痛苦,并且我们相信它将使编写新代码变得更容易。另一个巧妙的技巧是,在 $_SESSION 数组中创建新条目会自动将其注册为会话变量,就像调用 session_register() 一样。此技巧仅限于会话模块 - 例如,在 $_ENV 中设置新条目**不会**执行隐式 putenv()。
PHP 4.1.0 仍然默认将 register_globals 设置为打开状态。这是一个过渡版本,我们鼓励应用程序作者,尤其是面向广泛受众的公共应用程序,将其应用程序更改为在 register_globals 设置为关闭的环境中工作。当然,他们应该利用 PHP 4.1.0 中提供的使此过渡更容易的新特性。
从 PHP 的下一个次要版本开始,PHP 的新安装将默认将 register_globals 设置为关闭状态。不用担心!已经具有将 register_globals 设置为打开状态的 php.ini 文件的现有安装不会受到影响。仅当您在全新的机器上安装 PHP 时(通常,如果您是新用户),这才会影响您,即使那样 - 如果您选择,也可以将其打开。
注意:其中一些数组有旧名称,例如 $HTTP_GET_VARS。这些名称仍然有效,但我们鼓励用户切换到新的更短且自动全局的版本。
感谢 Shaun Clowes (shaun at securereality dot com dot au) 指出这个问题并对其进行分析。