PHP中的register_globals是什么?

sad*_*der 61 php

有人可以提供一些例子register_globals吗?
并被global $user_id;视为全球注册?

Tim*_*Tim 92

register_globals指令:

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

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

它的臭名昭着是因为它打开了许多安全漏洞,特别是对于那些从安全角度来看遵循任何低于严格编码风格的人.

经典例子:

if(user_is_admin($user))
{
    $authorized = true;
}

if($authorized)
{
    // let them do anything they want
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您在Web浏览器中访问该脚本并且服务器已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
}
Run Code Online (Sandbox Code Playgroud)

  • 2013年10月更新:自PHP 5.3.0起已注册Register_globals,从PHP 5.4.0开始已删除,因此应关闭它.http://ar2.php.net/manual/en/ini.core.php#ini.register-globals (6认同)

Aaj*_*hid 20

大家提的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];
Run Code Online (Sandbox Code Playgroud)

输出将是asd.

这将导致严重的安全问题和错误.我最近在使用Hostgator共享主机时遇到了这么糟糕的事情.默认他们有register_globals=on.

  • @AndreKR我没有看到根据*根本不是问题的一部分来评估答案的"完整性"是有意义的.;-) (2认同)

Bar*_*ter 15

当register_globals = on时,通过GET或POST或COOKIE传递的任何内容在代码中自动显示为全局变量,这可能会带来安全性后果.

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

当你做全局$ somevar时 - 你正在创建自己的全局变量,这通常不是一个大问题.

  • 如果你禁用register_globals,$ _GET []仍然会在这里. (3认同)

Nav*_*eed 9

register_globals设置控制您访问表单,服务器和环境的方式.变量.

register_globals = On:

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

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

您可以直接在one.php中访问

echo $myinput; // abc
Run Code Online (Sandbox Code Playgroud)

register_globals = Off:

您必须仅通过全局数组访问所有属性.

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

你必须访问one.php

echo $_GET['myinput']; //abc
Run Code Online (Sandbox Code Playgroud)


So *_* It 7

据我了解,如果你打开了注册全局变量,那么在GET或POST中传递的任何内容都会自动转换为PHP中的变量.

例如:

http://www.domain.com/vars.php?myvar=123
Run Code Online (Sandbox Code Playgroud)

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

$myvar  //with a value of 123
Run Code Online (Sandbox Code Playgroud)

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

http://php.net/manual/en/security.globals.php提供了有关此安全隐患的更多信息.

如果我错了,其他人可以随意纠正我.

编辑:

就你的问题而言global $user_id;,这并没有创造出'register_globals'意义上的'全球'.它只是改变了PHP代码中变量的范围.

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


小智 5

注册全局变量:

register_globals 该功能使通过 cookie 或 GET 和 POST 请求传递给 PHP 脚本的数据可用作脚本中的全局变量。

默认值:“0”

可变:PHP_INI_PERDIR

register_globals 受 variables_order 指令的影响。

笔记:

此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。