首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP函数pt_register

PHP函数pt_register
EN

Stack Overflow用户
提问于 2009-02-18 22:59:07
回答 9查看 1.9K关注 0票数 0

我是PHP的初学者,我接触到了经过处理的HTML表单,我正在学习如何使用它来做更多的事情……

我正在使用这个函数(基于Google,所以很多人都是这样的),但我真的想知道它在做什么……

代码语言:javascript
复制
function pt_register()
{
  $num_args = func_num_args();
   $vars = array();

   if ($num_args >= 2) {
       $method = strtoupper(func_get_arg(0));

       if (($method != 'SESSION') && ($method != 'GET') && ($method != 'POST') && ($method != 'SERVER') && ($method != 'COOKIE') && ($method != 'ENV')) {
           die('The first argument of pt_register must be one of the following: GET, POST, SESSION, SERVER, COOKIE, or ENV');
     }

       $varname = "HTTP_{$method}_VARS";
      global ${$varname};

       for ($i = 1; $i < $num_args; $i++) {
           $parameter = func_get_arg($i);

           if (isset(${$varname}[$parameter])) {
               global $$parameter;
               $$parameter = ${$varname}[$parameter];
          }

       }

   } else {
       die('You must specify at least two arguments');
   }

}

有没有人能用英语给我讲一遍?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-18 23:07:01

看起来它正试图成为register_globals的替代品

代码语言:javascript
复制
function pt_register()
{
  // Look at the arguments passed in...
  $num_args = func_num_args();
   $vars = array();

   // .. we need at least 2 arguments
   if ($num_args >= 2) {

        // $method is the middle part of name of one of PHPs old-style variables
       $method = strtoupper(func_get_arg(0));

       if (($method != 'SESSION') && ($method != 'GET') && ($method != 'POST') && ($method != 'SERVER') && ($method != 'COOKIE') && ($method != 'ENV')) {
           die('The first argument of pt_register must be one of the following: GET, POST, SESSION, SERVER, COOKIE, or ENV');
     }

      // $varname is the whole name of the variable
       $varname = "HTTP_{$method}_VARS";

      // Make the global variable (for example HTTP_SESSION_VARS) accessible from this function
      // ${$varname} is using a technique called "variable variables"
      // If $varname == "HTTP_SESSION_VARS" then $$varname (or ${$varname}) is the same as $HTTP_SESSION_VARS
      global ${$varname};

       // For each argument after the method
       for ($i = 1; $i < $num_args; $i++) {
           $parameter = func_get_arg($i);

           // If the parameter exists in the global variable...
           if (isset(${$varname}[$parameter])) {
               // .. make it global...
               global $$parameter;
               // ... and set its value
               $$parameter = ${$varname}[$parameter];
          }

       }

   } else {
       die('You must specify at least two arguments');
   }

}

因此,例如:pt_register('SESSION', 'foo');实际上是这样做的。

代码语言:javascript
复制
function example()
{
    global $HTTP_SESSION_VARS;
    global $foo;
    $foo = $HTTP_SESSION_VARS['foo'];
}

我的天,这个脚本是过时的和邪恶的!超全局变量$_SESSION等意味着你不应该这样做

票数 7
EN

Stack Overflow用户

发布于 2009-02-18 23:09:25

现在我的..。

这看起来像是替换了过时的register_globals设置的代码片段。

回到PHP4,所有类型的用户生成的参数都是直接作为普通变量作用域中的变量创建的。

简单地说,这意味着对index.php?test=helloWorld的调用将导致

代码语言:javascript
复制
<?php
  echo "$test<br/>";
?>

输出:

代码语言:javascript
复制
helloWorld<br/>

这被认为是程序员搬起石头砸自己脚的一个市长机会。自那以后,它被废除了。这是有充分理由的。

考虑以下代码:

代码语言:javascript
复制
<?php

if ( isAuthorised($userId, $sessionId) ) {
   $hasAccess = true;
}
// some lines
// of code...

if ( $hasAccess ) {
    echo 'sensitive information';
}

?>

如果用index.php?hasAccess=1调用它,会发生什么?

没错,调用您的脚本的邪恶分子刚刚获得了仅供授权用户使用的部分的访问权限。

摘要中的

它是一个模拟不再使用的功能的功能(自PHP5以来),因为它被认为是一个主要的安全风险。

您应该访问用户提供的参数,而不是使用上面的代码

代码语言:javascript
复制
<?php
    echo $_GET['test'].'<br />';
?>

希望这能有所帮助:)

票数 4
EN

Stack Overflow用户

发布于 2009-02-19 01:33:50

那些说它是注册全局变量的替代品的人是在正确的轨道上,但事实并非如此。

很久以前,当恐龙在互联网上游荡时,PHP还没有$_POST,$_GET,$_COOKIE,$_SESSION,$_SERVER,$_ETC超级全局变量。相反(除了臭名昭著的寄存器全局变量之外)还有一些常规的全局数组,名为

代码语言:javascript
复制
$HTTP_GET_VARS
$HTTP_POST_VARS
$HTTP_SERVER_VARS
etc..

这些数组,除了有不合理的长名称外,在使用之前需要声明为全局的(即,它们不是“像$_POST、$_GET等那样的超级/自动的全局变量”)。

pt_regsiter所做的是允许您将单个变量从这些数组之一导出到全局作用域中。因此,与其写

代码语言:javascript
复制
global      $HTTP_SERVER_VARS
global      $php_self;
$php_self   = $HTTP_SERVER_VARS['PHP_SELF']

你可以写。

代码语言:javascript
复制
pt_register('SERVER','PHP_SELF');

并且在全局作用域中有一个$php_self变量。

其他人已经评论了具体的机制,所以我最后要说的是,今天使用这个函数将是愚蠢的。

然而,它看起来像是起源于一些GNU代码back in 2002。考虑到PHP3仍然被广泛使用(人们正在向PHP4过渡),这个函数实际上是有意义的。

当时围绕PHP的大多数编码模式都非常依赖于全局名称空间来完成任务。这个函数实际上帮助限制了register_globals的问题。根据上面链接中的注释,作者希望您关闭register_globals,并使用此功能仅导出您需要的项目。

邪恶?不是的。在这个时代使用是非常愚蠢的吗?是

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/563233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档