如何取消设置全局变量?

时间:2015-02-01 02:17:41

标签: php

    <?php 
echo "test";
     echo $city;
     ?>

即使没有其他代码,这仍然会从网址回显城市 在页面上。 我假设这是一个全局变量...

<?php
        unset($GLOBALS[_SERVER]);
        echo $city;
        ?>

我已经启动并销毁了一个会话以确保不在会话中。 如果我更改变量,它将不会回显。 如果我将网址?city = Boston更改为?city = Chicago,那么它会更新。

$ city = $ _GET [“city”];在页面上不存在...页面的其余部分为空。

2 个答案:

答案 0 :(得分:4)

启用了您正在描述的行为,如PHP register_globals配置选项。此选项会导致在脚本启动期间将所有GET和POST变量(以及可选的cookie)创建为全局变量。这是一个巨大的安全问题,因此自PHP 4.2.0(2002年4月发布)以来一直违约,并且在PHP 5.4及更高版本(2012年3月发布)中根本无法启用。它为您的系统启用的事实令人不安,因为它表明您运行的是PHP 5.3或更早版本,它不再接收安全补丁!

要禁用它,请将PHP升级到支持的版本。

如果无法做到这一点,请编辑PHP配置文件,找到设置register_globals = On(或= 1)的行,然后将其删除。十多年来一直没有推荐这种方案;它不应该被启用。

(没有安全的方法可以在运行时禁用register_globals。使用ini_set()禁用它并不起作用,因为它在脚本启动之前生效,并且没有办法安全删除它创建的所有变量,因为这些变量有时可能会覆盖系统全局变量。唯一安全的方法是完全关闭它。)

答案 1 :(得分:1)

$city已有值的最可能原因是register_globals设置为ON。这意味着每个GETPOST和其他一些变量都在脚本中注册为全局变量。例如,如果您打开类似script.php?city=New+York的脚本,则会在代码中定义一个变量$city,其值为&#34;纽约&#34;。

如果您不想要这种行为,则需要在register_globals中停用php.ini

详细了解register_globals http://php.net/manual/en/security.globals.php