什么是PHP中的register_globals?

有人可以举一些register_globals例子吗?
并且是global $user_id; 认为全球注册?

register_globals指令:

register_globals是一个内部PHP设置,它将$_REQUEST数组元素注册为variables。 如果您通过POSTGET提交表单中的值,则可以通过PHP脚本中的variables自动访问该input的值,该variables以input字段的名称命名。

换句话说,如果您提交了一个包含username文本字段的表单,脚本开头的expression式($username === $_POST['username'])将返回true

它的恶名主要是因为它带来了很多安全漏洞,特别是对于那些从安全angular度来看并不严格的编码风格的人来说。

经典示例:

 if(user_is_admin($user)) { $authorized = true; } if($authorized) { // let them do anything they want } 

现在,如果您在networking浏览器中访问了该脚本,并且服务器已启用了register_globals ,则可以简单地将?authorized=1附加到该URL,并启用god-mode!

global关键字:

global是一个关键字与register_globals无关。

这是一个使用的例子:

 $foo = 'bar'; baz(); function baz() { echo $foo; // PHP warns you about trying to use an uninitialized variable // and nothing is output (because $foo doesn't exist here) } buzz(); function buzz() { global $foo; // Enables the use of $foo in this scope echo $foo; // Prints 'bar' to screen } 

大家都提到GETPOSTREQUESTCOOKIEregister_globals=on有影响。

我只是写这个让你知道 –

$_SESSION将受到影响,因为register_globals=on http://php.net/manual/en/security.globals.php

这意味着 – 如果你这样做 –

 $_SESSION[x] = 123; $x = 'asd'; echo $_SESSION[x]; 

输出将是asd

这将导致严重的安全问题和错误。 最近我在使用HostGator共享主机时遇到过这样的坏事。 默认情况下他们有register_globals=on

当你有register_globals = on的时候,任何通过GET或者POST或者COOKIE传递的东西都会自动显示为代码中的全局variables,这可能会带来安全性的后果。

即你点击url test.php?access_level = 100,你将有$ access_level = 100在PHP中。

当你做全球$ somevar – 你正在做自己的全局variables,这通常不是一个大问题。

register_globals设置控制你如何访问表单,服务器和环境。 variables。

register_globals =开:

您可以访问没有全局数组(GET [],POST []和REQUEST [])的表单属性

例如: http //www.example.com/one.php?myinput = abc

你可以直接访问one.php

 echo $myinput; // abc 

register_globals =关:

您只能通过Global Arrays访问所有属性。

例如: http //www.example.com/one.php?myinput = abc

你必须访问one.php

 echo $_GET['myinput']; //abc 

据我了解,如果你注册全局变为ON,那么通过GET或POST传递的任何东西都会自动转换成PHP中的variables。

例如:

 http://www.domain.com/vars.php?myvar=123 

没有任何进一步的编码,这将自动变成一个variables可用于您的PHP代码的其余部分

 $myvar //with a value of 123 

注册全局variables为OFF时,通过GET或POST传入的数据不会自动转换成variables,而是需要使用Superglobals $ _GET,$ _POST和$ _REQUEST等来请求它。

http://php.net/manual/en/security.globals.php提供了一些关于这个的安全影响的进一步的信息。;

其他人可以随时纠正我,如果我错了。

编辑:

关于你的问题re global $user_id; ,这不会在“register_globals”的意义上创build一个“全局”。 它只是改变了PHP代码中的一个variables的范围。

有关信息范围,请参阅: http : //php.net/manual/en/language.variables.scope.php

PHP中的全局variables是始终可访问的variables。 他们也被称为superglobals。 它们是build立在variables总是可用的,而不pipe范围如何。

PHP中有9个超全局variables。 其中一些与这个讨论有关。

  1. $_REQUEST
  2. $_POST
  3. $_GET
  4. $_COOKIE

现在,我们来关注$_REQUEST超全局。 用于使用POST方法提交HTML表单后,用于收集数据。

可以松散地使用$_POST$_REQUEST 。 但$_REQUEST还包含$_GET$_COOKIE以及$_POST所以您不能确定您的数据是否来自Web表单。

现在,正如@Tim所指出的register_globals是一个内部PHP设置,它将$_REQUEST数组的元素注册为variables。 它也被称为您的PHP设置中的flag 。 它通常在PHPconfiguration文件中被设置为php.ini文件。 该设置可以有两个值。

  1. “上”
  2. “关”。

“on”值意味着PHP将自动为许多服务器variables以及查询string参数创build全局variables。 这不好,是一个安全风险。

注册全局:

register_globals该function使得通过cookies或GET和POST请求传递给PHP脚本的数据在脚本中作为全局variables可用。

默认值:“0”

可更改:PHP_INI_PERDIR

register_globals受到variables_order指令的影响。

注意:

这个特性自PHP 5.3.0开始已经被拒绝,从PHP 5.4.0开始已经被删除了。