PHP安全之register_globals

摘要:
但是register_关闭全局变量改变了代码中的变量与客户端发送的变量混合的糟糕情况。˃当register_当globals=on时,上述代码将是危险的。例如,如果在执行上述代码之前添加$authorized=false,则无论register_Globals是开还是关,因为用户状态都初始化为未经身份验证。如果配置文件中的变量是changed_Order选项,请考虑对$superglobals进行相应的更改。

一、register_globals = Off 和 register_globals = On的区别

register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数.

register_globals的值可以设置为: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 了,虽然你可以设置它为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();  
      
    ?>  

转载:http://blog.csdn.net/alex_best/article/details/6076684

免责声明:文章转载自《PHP安全之register_globals》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇activemq 安装配置二kvm虚拟机扩展磁盘空间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pcntl_fork()函数说明

pcntl_fork()函数复制了当前进程的PCB,并向父进程返回了派生子进程的pid,父子进程并行,打印语句的先后完全看系统的调度算法,打印的内容控制则靠pid变量来控制。因为我们知道pcntl_fork()向父进程返回了派生子进程的pid,是个正整数;而派生子进程的pid变量并没有被改变,这一区别使得我们看到了他们的不同输出。 1. 派生子进程的进程,...

多线程下C#如何保证线程安全?

  多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。 线程安全问题都是由全局变量及静态变量引起的。   为了保证多线程情况下,访问静态变量的安全,可以用锁机制来...

PHP运算符“逻辑运算符”

今天来给大家讲解PHP的第五种运算符,也是在我们程序中非常重要的一组运算符,“逻辑运算符”。大理石量具哪家好 什么是逻辑运算符? 逻辑运算,大家应该都不陌生,在上学期间数学课本里面就有关于逻辑运算的知识,就是我们常说的“或与非”;逻辑运算符是PHP程序中一组非常重要的运算符,用来组合逻辑运算的结果。 PHP中的逻辑运算符如下表 运算符名称 例子 结果...

Vue中的computed属性

参考:https://www.cnblogs.com/gunelark/p/8492468.html 看了网上很多资料,对vue的computed讲解自己看的都不是很清晰,今天忙里抽闲,和同事们又闲聊起来,对computed这个属性才有了一个稍微比较清晰的认识,下面的文章有一部分是转自: https://www.w3cplus.com/vue/vue-c...

less的基本用法

Less也是一种动态样式语言. 对CSS赋予了动态语言的特性,如变量,继承,运算, 函数. Less 既可以在客户端上运行 (支持IE 6+, Webkit, Firefox),也可在服务端运行 (借助 Node.js)。 使用方式 两种使用方式:第一种全局安装less,利用命令编译less;第二种直接引入less.js. npm安装 npm instal...

Docker pull php:7.1-fpm的php.ini配置修改

今天,换了 Deepin 操作系统,开发环境是通过 Docker 搭建的,具体结构如下: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAME...