一、什么是register_globals
register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数.
register_globals的值可以设置为:On或者Off
1、On和Off的区别
<form action='' method='get'>
<input type='text' name='username' value='alex' >
<input type='submit' name='sub' value='sub'>
</form>
<?php
echo 'username::',$username;
echo '<br>sub::',$sub;
echo '<br>GET::';
print_r($_GET);
?>
register_globals = On的时候,程序输出如下:
username::alex sub::sub array ( [username] => alex [sub] => sub )
register_globals = Off的时候,程序输出如下:
username:: sub:: array ( [username] => alex [sub] => sub )
register_globals的意思就是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。
二、必须使用register_globals = Off
1.PHP 4.2.0 版开始配置文件中 register_globals 的默认值从 on 改为 off 了。
2.当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML 表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。当打开时,人们使用变量时确实不知道变量是哪里来的,只能想当然。但是 register_globals 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。
<?php
// 当用户合法的时候,赋值
$authorized = true
if (authenticated_user()) {
$authorized=true;
}
// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
include"/highly/sensitive/data.php";
}
?>
当 register_globals = on 的时候,上面的代码就会有危险了。如果是 off,$authorized 就不能通过如 URL 请求等方式来改变,这样就好多了,尽管初始化变量是一个良好的编程习惯。比如说,如果在上面的代码执行之前加入 $authorized = false 的话,无论 register_globals 是 on 还是 off 都可以,因为用户状态被初始化为未经认证。 三、如果需要在一台关闭了 register_globals 的共享主机上运行一些旧式程序而该程序需要此选项打开时怎么办? 本例模拟 register_globals On。如果改变了配置文件中的 variables_order 选项,则考虑对 $superglobals 作出相应的改动。
<?php// Emulate register_globals on
if (!ini_get('register_globals')) {
$superglobals= array($_SERVER,$_ENV,$_FILES,$_COOKIE,$_POST,$_GET);
if (isset($_SESSION)) {
array_unshift($superglobals,$_SESSION);
}
foreach ($superglobals as $superglobal) {
extract($superglobal,EXTR_SKIP);
}
}
?>
四、如果需要在一些打开了register_globals选项的主机上但想消除安全隐患,该怎么办? 本例模拟 register_globals Off。要记住此代码应在脚本最开头的地方调用。如果使用了会话机制,则在 session_start() 之后调用。
<?php// Emulate register_globals off
functionun register_GLOBALS(){
if (!ini_get('register_globals')) {
return;
}
// Might want to change this perhaps to a nicer error
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
// Variables that shouldn't be unset
$noUnset= array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES');
$input=array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES,isset($_SESSION) &&is_array($_SESSION) ?$_SESSION: array());
foreach ($input as $k=>$v) {
if (!in_array($k,$noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
}
unregister_GLOBALS();
?>
今天的文章PHP安全register_globals—PHP学习之路[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/70001.html