<?php
echo "test";
echo $city;
?>
即使没有其他代码,这也会不断从 url 中回显出城市在页面上。我假设这是一个全局变量...
<?php
unset($GLOBALS[_SERVER]);
echo $city;
?>
我已经启动并销毁了一个会话,以确保不在会话中。如果我更改变量,它不会回显出来。如果我将网址 ?city=Boston 更改为 ?city=Chicago,那么它会更新。
$city = $_GET["城市"];页面上不存在...页面的其余部分为空。
您描述的行为听起来像是启用了 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()
禁用它不起作用,因为它在脚本启动之前生效,并且无法安全地删除它创建的所有变量,因为这些变量有时可能会覆盖系统全局变量。唯一安全的方法是完全关闭它。
$city
已经有一个值的最可能原因是register_globals
设置ON
。这意味着每个GET
、POST
和其他一些变量都注册为脚本中的全局变量。例如,如果您像 script.php?city=New+York
一样打开脚本,您将在代码中定义一个值为"New York"$city
变量。
如果您不希望出现这种行为,则需要在php.ini
中禁用register_globals
。
在此处阅读有关register_globals
的更多信息 http://php.net/manual/en/security.globals.php