|
尊敬的万网虚拟主机用户:您好!
为了提高UNIX主机的安全性,保证用户的网站和数据安全,万网将在2006年6月初对全部UNIX主机的PHP进行安全策略调整,届时将关闭全局变量(Register Globals),请您尽快对相关程序进行修改,避免出现无法网站无法正常访问的情况,特此通知!
以下是PHP官方手册中有关于《使用 Register Globals》的说明,请您参考: PHP 中最具争议的变化就是从 PHP4.2.0版开始配置文件中 register_globals 的默认值从 on 改为 off 了。对此选项的依赖是如此普遍以至于很多人根本不知道它的存在而以为 PHP本来就是这么工作的。
当register_globals 打开以后,各种变量都被注入代码,例如来自HTML表单的请求变量。再加上PHP在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。这是个很艰难的抉择,但 PHP 社区还是决定默认关闭此选项。当打开时,人们使用变量时确实不知道变量是哪里来的,只能想当然。但是 register_globals 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。
下面使用 register_globals = on 的例子
<?php
// 当用户合法的时候,赋值 $authorized = true
if (authenticated_user()) {
$authorized = true;
}
// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
include "/highly/sensitive/data.php";
}
? >
当 register_globals = on 的时候,上面的代码就会有危险了。如果是 off,$authorized 就不能通过如URL请求等方式来改变,这样就好多了,尽管初始化变量是一个良好的编程习惯。比如说,如果在上面的代码执行之前加入 $authorized = false 的话,无论 register_globals 是 on 还是 off 都可以,因为用户状态被初始化为未经认证。
解决方案如下:
可以在需要的程序的顶部引用下面程序,达到实现了跟开启 Register Globals 同样的功能。代码请参考(以下代码需要结合您的程序进行修改,直接无法调用):
<?php function register_globals($item, $key) { global $$key; $$key = $item; } arrayfoo($_GET , 'register_globals'); arrayfoo($_POST , 'register_globals'); arrayfoo($_COOKIE , 'register_globals'); arrayfoo($_SERVER , 'register_globals'); ... session_start(); arrayfoo($_SESSION , 'register_globals'); ... ?>
其中 arrayfoo($_SESSION , ‘register_globals’); 要放在 session_start(); 之后才管用。
我们为给您带来的任何不便致以深深的歉意。也希望您能在今后的合作中给我们提出更好的建议,愿我们不断提高的服务品质能换取您更长久的信任与支持!
中国万网客服中心
2006.5.12
|