• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP安全之register_globals的on和off的区别

    一、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.PHP4.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(); 
     
     ?>

    到此这篇关于PHP安全之register_globals的on和off的区别的文章就介绍到这了,更多相关PHP安全 register_globals内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • PHP安全配置优化详解
    • PHP网站常见安全漏洞,及相应防范措施总结
    • php解决安全问题的方法实例
    • PHP开发api接口安全验证的实例讲解
    • PHP网页安全认证的实例详解
    • PHP实现根据密码长度显示安全条
    • PHP更安全的密码加密机制Bcrypt详解
    • 浅谈php(codeigniter)安全性注意事项
    • 如何让PHP的代码更安全
    上一篇:PHP代码覆盖率统计详解
    下一篇:php实现商城购物车的思路和源码分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP安全之register_globals的on和off的区别 PHP,安全,之,register,globals,