了解 PHP 文件的工作原理(自动解码查询字符串?


Understanding how PHP file worked (auto-decode of query string?)

我正在调试一个我以前从未见过的PHP文件(不是我的代码),但据说可以工作。

myfile.php的示例代码片段:

<html>
<body>
<p>
<?
    echo $Year;
?>
</p>
</body>
</html>

连线方式来看,代码似乎设置为从查询字符串(HTTP GET)中提取年份:http://server.com/myfile.php?Year=2010

这应该以前有效,但现在不再有效了。

是否有 PHP 设置来控制这一点? 这是在PHP版本中被禁用的"功能"吗? 我从未见过在$_GET之外使用的GET变量

看起来以前的服务器被设置为注册全局

http://www.php.net/manual/en/ini.core.php#ini.register-globals

http://php.net/manual/en/security.globals.php

注意:此功能已从 PHP 5.3.0 开始弃用,从 PHP 5.4.0 开始被删除。

与其更改服务器配置以支持已弃用且不安全的功能,不如通过访问全局$_GET来修复代码:

<?php 
$Year = isset($_GET['Year']) ? $_GET['Year'] : null;
?>
<html>
<body>
<p>
<?php
    echo htmlspecialchars($Year);
?>
</p>
</body>
</html>

PHP 指令 register_globals 将打开/关闭一个工具,以自动将查询字符串解码为同名的全局变量。在许多人看来,这是一个可怕的想法,因为变量可能没有明显的来源或价值。

它曾经默认为on,但在PHP 4.2中改为off。您仍然可以在 PHP 中启用它。.INI。它已从 PHP5.3 开始弃用,并在 PHP 5.4 中删除。

如果您的代码可以工作,但现在不能工作,请查找版本更改(到 PHP 5.4),或检查 php.ini 中的内容。

无论如何,如果您正在查看代码,现在可能是更改为对$_GET的引用并禁用register_globals的好时机