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

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

    register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同。

    1. <form action='' method='get'>
    2. <input type='text' name='username' value='alex' >
    3. <input type='submit' name='sub' value='sub'>
    4. </form>
    5. <?php
    6. echo 'username::',$username;
    7. echo '<br>sub::',$sub;
    8. echo '<br>GET::';
    9. print_r($_GET);
    10. ?>

    <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的时候,程序运行提交输出结果为:

    1. username::alex
    2. sub::sub
    3. array ( [username] => alex [sub] => sub )

    username::alex

    sub::sub

    array ( [username] => alex [sub] => sub )

    当register_globals = Off的时候,程序运行提交输出结果为:

    1. username::
    2. sub::
    3. array ( [username] => alex [sub] => sub )

    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 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。例子来源手册

    1. <?php
    2. // 当用户合法的时候,赋值
    3. $authorized = true
    4. if (authenticated_user()) {
    5. $authorized=true;
    6. }
    7. // 由于并没有事先把 $authorized 初始化为 false,
    8. // 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
    9. // 所以任何人都可以绕过身份验证
    10. if ($authorized) {
    11. include"/highly/sensitive/data.php";
    12. }
    13. ?>

    <?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 作出相应的改动。

    1. <?php// Emulate register_globals on
    2. if (!ini_get('register_globals')) {
    3. $superglobals= array($_SERVER,$_ENV,$_FILES,$_COOKIE,$_POST,$_GET);
    4. if (isset($_SESSION)) {
    5. array_unshift($superglobals,$_SESSION);
    6. }
    7. foreach ($superglobals as $superglobal) {
    8. extract($superglobal,EXTR_SKIP);
    9. }
    10. }
    11. ?>

    <?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() 之后调用。

    1. <?php// Emulate register_globals off
    2. functionun register_GLOBALS(){
    3. if (!ini_get('register_globals')) {
    4. return;
    5. }
    6. // Might want to change this perhaps to a nicer error
    7. if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
    8. die('GLOBALS overwrite attempt detected');
    9. }
    10. // Variables that shouldn't be unset
    11. $noUnset= array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES');
    12. $input=array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES,isset($_SESSION) &&is_array($_SESSION) ?$_SESSION: array());
    13. foreach ($input as $k=>$v) {
    14. if (!in_array($k,$noUnset) && isset($GLOBALS[$k])) {
    15. unset($GLOBALS[$k]);
    16. }
    17. }
    18. }
    19. unregister_GLOBALS();
    20. ?>

<?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();

?>

https://www.cnblogs.com/wawahaha/p/4820591.html

PHP安全之register_globals (转)的更多相关文章

  1. php的register_globals配置

    1.需求 看ci文档的时候,看到register_globals,要了解这个配置的使用 2.分析 register_globals是PHP.ini里的一个配置,这个配置影响到php如何接收传递过来的参 ...

  2. php配置中的register_globals用法

    开发的时候设置成register_globals=off,只能通过post或get得到前端数据. 参考资料:http://blog.csdn.net/alex_best/article/details ...

  3. php安全编程: register_globals的安全性

    register_globals?本身并非安全风险.但是,它为跟踪用户输入和确保应用程序安全增加了难度.为什么会这样? 因为如果打开 register_globals,在全局名称空间和 $_GET.$ ...

  4. register_globals

    register_globals参数为On的时候很危险 这里记录一下各版本register_globals的情况 PHP5.2版本register_globals默认为On PHP5.3 PHP5.3 ...

  5. PHP安全之register_globals

    一.register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过 ...

  6. register_globals(全局变量注册开关)

    register_globals,是php.ini文件里面的一个配置选项,接下来,我们可以通过例程来分析一下,当register_globals = on 与 register_globals = o ...

  7. PHP安全编程:register_globals的安全性 全局变量注册(转)

    如果你还能记起早期Web应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会.当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立.它 ...

  8. PHP安全编程:register_globals的安全性

    如果你还能记起早期Web应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会.当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立.它 ...

  9. PHP安全之 register_globals

    一.register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过 ...

随机推荐

  1. JavaScript语言简介

    Web程序不论是B/S还是C/S构架,分为客户端程序与服务器端程序两种. ASP.NET是开发服务器端程序的强大工具,但有时为了降低服务器负担与通信流量,这就需要编写能够在客户端执行的程序. 脚本语言 ...

  2. 30. Substring with Concatenation of All Words *HARD*

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  3. Zookeeper架构、ZAB协议、选举

    转载:深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制  (nice) ZooKeeper学习第六期---ZooKeeper机制架构 一.Zookee ...

  4. javascript里的偏函数——本质函数式编程+闭包,返回函数

    最终效果: var greet = function(greeting, name) { return greeting + ' ' + name; }; var sayHelloTo = _.par ...

  5. Mybatis学习总结--------Mybatis <where>标签 (九)

      <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WH ...

  6. PHP:第四章——PHP数组添加,删除,插入,分割,合并,及运算符

    <pre> <?php header("Content-Type:text/html;charset=utf-8"); /*知识点一:赋值运算符 = 代码示例:数 ...

  7. spi signal analyze using logic analyzer

    logic analyzer device: Saleae Logic 16 Pc software gui: capture signal picture:   send command 0x55  ...

  8. Python - Learn Note (3)

    Python之模块 包就是文件夹:包可以有多级: 模块就是 xxx.py文件:可以创建自己的模块,并且导入它们,模块的名字就和文件的名字相同: Python使用import语句导入一个模块. impo ...

  9. python3.6 连接mysql数据库

    ==================pymysql=================== 由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 ...

  10. python关于时间的计算,time模块

    import time, datetime # time.time 返回当前时间的时间戳(1970纪元后经过的浮点秒数)(格林尼治时间). # 1分钟60秒,1小时3600秒,1天86400秒. pr ...