【问题标题】:Updating deprecated Code [duplicate]更新已弃用的代码 [重复]
【发布时间】:2012-01-24 16:02:19
【问题描述】:

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

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

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

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

这是我的代码:

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;
    }
}

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

【问题讨论】:

  • you were told that explained how时你得到的答案
  • 对不起,没有得到它,研究也没有帮助,因此重新提出了问题。项目现已解决,脚本正常工作。

标签: php


【解决方案1】:

分别使用$_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 了解更多信息。

【讨论】:

    【解决方案2】:

    是的,使用 $_POST['variable_name'] 代替全局 $HTTP_POST_VARS 和 $_GET['variable_name'] 代替 $HTTP_GET_VARS

    【讨论】:

      【解决方案3】:

      这段代码基本上完成了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); 来修复它(假设该函数始终在全局范围内调用,而不是在函数内部)。

      【讨论】:

        【解决方案4】:

        试试这个:

        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;
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-14
          • 1970-01-01
          • 1970-01-01
          • 2020-05-24
          • 2018-03-11
          相关资源
          最近更新 更多