PHP 日本大会 2024

PHP 4.1.0 发布公告

经过漫长的“质量保证”过程,PHP 4.1.0 终于发布了!
[ 英文版 ]

PHP 4.1.0 包含了许多重要的改进

正如一些人指出的,这个版本在某种程度上具有历史意义,因为这是我们第一次增加中间版本号!造成这种情况的两个主要原因是,一方面是新输入接口的空前变化,另一方面是由于版本支持导致的模块不兼容。

下面是对新输入机制的描述。有关完整更改列表,请参阅 ChangeLog


安全:新的输入机制

首先,重要的是要注意,无论您在以下内容中读到什么,PHP 4.1.0 仍然支持旧版本的旧输入机制。旧的应用程序应该可以在不修改的情况下正常工作!

现在我们来说说正事 :)

由于各种原因,依赖于 register_globals 为 ON 的 PHP(例如,来自表单、服务器和环境变量的变量会自动成为脚本[命名空间]的全局范围的一部分)通常容易受到各种程度的攻击。例如,以下代码

<?php
if (authenticate_user()) {
$authenticated = true;
}
...
?>

可以被远程用户通过在表单中传递“authenticated”变量来利用,即使 authenticate_user() 返回 false,$authenticated 也会包含 true。这看起来像是一个非常简单的例子,但实际上,许多 PHP 应用程序都容易受到此问题的攻击。

虽然完全有可能编写安全的 PHP 代码,但我们认为 PHP 过于容易地允许编写不安全的 PHP 代码是不可接受的,因此我们决定进行一项重大的更改,并使 register_globals 过时。当然,由于世界上绝大多数 PHP 代码都依赖于此功能的存在,因此我们永远不会将其删除,但我们决定鼓励用户尽可能地避免使用它。

为了帮助用户在 register_globals 为 OFF 的情况下构建 PHP 应用程序,我们添加了一些新的特殊变量,这些变量可以用作旧全局变量的替代。有 7 个新的特殊数组

现在,除了这些变量包含这些特殊信息之外,它们还在所有范围内自动成为全局变量。这意味着您可以从任何地方访问它们,而无需声明为全局变量。例如

<?php
function example1()
{
print
$_GET["name"]; // 工作正常,不需要 'global $_GET;'!
}
?>

将工作得很好!我们希望这将使从旧代码迁移到新代码变得更容易,并且我们相信这将简化新代码的编写。另一个技巧是,在 $_SESSION 中创建新条目会自动将它们注册为会话变量,就像您调用 session_register() 一样。此技巧仅限于会话处理模块 - 例如,在 $_ENV 中创建新条目 **不会** 隐式执行 put_env()。

默认情况下,PHP 4.1.0 仍然需要将 register_globals 设置为 ON。这是一个过渡版本,我们鼓励应用程序作者,尤其是面向大量受众的公共应用程序,更改其应用程序以在 register_globals 为 OFF 的环境中工作。很明显,他们应该利用 PHP 4.1.0 提供的新特性,这些特性使过渡变得更容易。

在下一个“次要”版本的 PHP 中,新安装的 PHP 应该默认将 register_globals 设置为 OFF。别担心!已经具有将 register_globals 设置为 ON 的 php.ini 文件的现有安装将不受影响。这只会影响您在新的机器上安装 PHP 的情况(通常是在您是新用户的情况下),并且如果您愿意,您仍然可以将其设置为 ON。

注意:某些这些数组具有旧名称,例如:$HTTP_GET_VARS。这些名称仍然有效,但我们鼓励用户迁移到新的、更短的名称,这些名称是自动全局变量。

感谢 Shaun Clowes (shaun at securereality dot com dot au) 发现了这个问题并帮助分析了它。

法语翻译由 Pierre-Alain Joye (pierre-alain dot joye at wanadoo dot fr) 提供。

To Top