3

我遇到了一些在其他人的代码中为表单验证器工作的代码。它应该从发布的表单数据中返回一个值。不管怎样,它总是回来NULL的。这就是函数的全部内容(假设这段代码确实在某一时刻有效):

function _getValue($field)
{
    global ${$field};
    return ${$field};
}

从其他函数的上下文中,我可以看出它试图从(在这种情况下)$_POST 变量中获取值。当我将功能更改为以下内容时,一切都像魅力一样:

function _getValue($field)
{
    // $_REQUEST should hold $_GET and $_POST values
    return $_REQUEST[$field];
}

所以我的问题是......在这种情况下到底是什么global ${$field}意思?我知道是什么${$field},但假设他们传递email给了那个函数。这个全局$email变量是从哪里来的?

原始功能应该如何工作?我知道有什么叫做“Super Globals”之类的东西,那很糟糕。这有关系吗?这可能是它停止工作的原因吗?楼主是不是关了Super Globals?

[编辑]我提出问题的方式明显有些混乱。我知道 ${$field} 和 $$field 是什么意思,但我不知道如何

global ${$field};
return ${$field};

返回用户放入表单中的值,例如

<input name="email">

你打电话时

$this->_getValue('email');
4

3 回答 3

2

由于register_globals指令,您之前的程序员希望 POST 变量位于全局空间中。值得庆幸的是,此功能在 PHP 4.2 中默认关闭,并在 PHP 5.4 中删除。

引用文档:

当打开时, register_globals 将向您的脚本注入各种变量,例如来自 HTML 表单的请求变量。

我想知道怎么会有人认为这是个好主意:)

于 2012-08-07T01:07:48.730 回答
0

是的,它与 register_globals 有关,是的,它非常糟糕。我认为您已经从非常旧的代码中获取了它。现在默认情况下,Php 将 register_globals 设置为关闭。这就是代码不起作用的原因。您的修复是正确的。Register_globals 不好,因为它会产生严重的安全风险问题。

于 2012-08-07T01:09:12.347 回答
0

显然,我对问题的措辞不佳,我很抱歉,但是从 Radu 和 pst 对 Radu 的帖子的评论中,我发现以下内容完美地回答了我的问题(如在http://php.net/manual/上找到的) zh/security.globals.php):

注意:处理 register_globals

如果不推荐使用的register_globals指令设置为on,则其中的变量也将在脚本的全局范围内可用。例如,$_POST['foo']也将作为$foo.

于 2012-08-07T01:09:31.650 回答