什么是PHP中的register_globals?
有人可以举一些register_globals
例子吗?
并且是global $user_id;
认为全球注册?
register_globals
指令:
register_globals
是一个内部PHP设置,它将$_REQUEST
数组元素注册为variables。 如果您通过POST
或GET
提交表单中的值,则可以通过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 }
大家都提到GET
, POST
, REQUEST
, COOKIE
对register_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。 其中一些与这个讨论有关。
-
$_REQUEST
-
$_POST
-
$_GET
-
$_COOKIE
现在,我们来关注$_REQUEST
超全局。 用于使用POST
方法提交HTML表单后,用于收集数据。
可以松散地使用$_POST
和$_REQUEST
。 但$_REQUEST
还包含$_GET
和$_COOKIE
以及$_POST
所以您不能确定您的数据是否来自Web表单。
现在,正如@Tim所指出的register_globals
是一个内部PHP设置,它将$_REQUEST
数组的元素注册为variables。 它也被称为您的PHP设置中的flag
。 它通常在PHPconfiguration文件中被设置为php.ini
文件。 该设置可以有两个值。
- “上”
- “关”。
“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开始已经被删除了。