<?php
echo "test";
echo $city;
?>
即使没有其他代码,这仍然会从网址回显城市 在页面上。 我假设这是一个全局变量...
<?php
unset($GLOBALS[_SERVER]);
echo $city;
?>
我已经启动并销毁了一个会话以确保不在会话中。 如果我更改变量,它将不会回显。 如果我将网址?city = Boston更改为?city = Chicago,那么它会更新。
$ city = $ _GET [“city”];在页面上不存在...页面的其余部分为空。
答案 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
。这意味着每个GET
,POST
和其他一些变量都在脚本中注册为全局变量。例如,如果您打开类似script.php?city=New+York
的脚本,则会在代码中定义一个变量$city
,其值为&#34;纽约&#34;。
如果您不想要这种行为,则需要在register_globals
中停用php.ini
。
详细了解register_globals
http://php.net/manual/en/security.globals.php