更新已弃用的代码

时间:2011-12-20 17:52:18

标签: php

  

可能重复:
  Is using $GLOBALS['HTTP_GET_VARS'] deprecated?
  Invalid arguements in php

我在WAMP环境中运行脚本时收到以下响应:

  

警告:为foreach()提供的参数无效   第17行的C:\ wamp \ www \ GeCard \ eCardScript_ecards \ ecard_lib.php

     

警告:为foreach()提供的参数无效   第21行的C:\ wamp \ www \ GeCard \ eCardScript_ecards \ ecard_lib.php

这是我的代码:

function getPostGetVars() {
    global $HTTP_POST_VARS,$HTTP_GET_VARS;

    foreach ($HTTP_POST_VARS as $key => $value) {  //This is line 17
        global $$key;
        $$key = $value;
    }

    foreach ($HTTP_GET_VARS as $key => $value) {   //This is line 21
        global $$key;
        $$key = $value;
    }
}

我被告知此代码已被弃用。可以轻松更新这段代码以消除警告吗?

4 个答案:

答案 0 :(得分:1)

此代码基本上执行register_globals = on所做的事情,只是更糟糕的方式(GET优先于POST)。您应该完全删除此代码并更新脚本以使用适当的变量$_POST['field']$_GET['field']来访问POST / GET数据,而不是仅使用$field

代码停止工作的原因是$HTTP_*_VARS已替换为$_*超全球,因此要修复它,请删除global $HTTP_POST_VARS,$HTTP_GET_VARS;并将$HTTP_POST_VARS替换为$_POST (同样适用于$HTTP_GET_VARS)。

但是,你也可以通过完全删除函数并用extract($_REQUEST);替换调用来修复它(假设函数总是在全局范围内调用,而不是在函数内部调用)。

答案 1 :(得分:0)

试试这个:

function getPostGetVars() {
  global $_POST,$_GET;
  foreach ($_POST as $key => $value) {  //This is line 17
    global $$key;
    $$key = $value;
  }
  foreach ($_GET as $key => $value) {   //This is line 21
    global $$key;
    $$key = $value;
  }
}

答案 2 :(得分:0)

分别使用$_POST$_GET代替$HTTP_POST_VARS$HTTP_GET_VARS

function getPostGetVars() {
  foreach ($_POST as $key => $value) {  //This is line 17
    global $$key;
    $$key = $value;
  }
  foreach ($_GET as $key => $value) {   //This is line 21
    global $$key;
    $$key = $value;
  }
}

如果您查看$_POST$_GET的手册页,您会看到他们更详细的同行已被弃用。


我不禁注意到你试图用这段代码做什么,实际上反映了extract()的功能。我会提醒您这样做,因为攻击者可以使用请求重写必要变量(比如$isLoggedIn)并利用服务器。如果您继续执行此类操作,建议您使用extract()并使用EXTR_PREFIX_ALL等标记,以便不会发生冲突。例如,您可以使用get_为get变量添加前缀,为post_添加post变量。

但是,除非您真正知道自己在做什么,否则在生产环境中使用这样的提取(或您的方法) 是危险的。我会建议完全反对它,而是使用适当的超级全局变量来访问$_GET$_POST变量。

有关详情,请参阅this post by Marc B on this vulnerability

答案 3 :(得分:0)

是的,使用$ _POST ['variable_name']代替全球$ HTTP_POST_VARS和$ _GET ['变量名称'] $ HTTP_GET_VARS