PHP安全之register_globals的on和off的区别


Posted in PHP onJuly 23, 2020

一、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 相关文章推荐
Windows中安装Apache2和PHP4权威指南
Nov 18 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
Sep 12 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP APP微信提现接口代码
Sep 30 PHP
php文件包含的几种方式总结
Sep 19 PHP
PHP代码覆盖率统计详解
Jul 22 #PHP
php实现统计IP数及在线人数的示例代码
Jul 22 #PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 #PHP
浅谈PHP之ThinkPHP框架使用详解
Jul 21 #PHP
浅谈php常用的7大框架的优缺点
Jul 20 #PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 #PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 #PHP
You might like
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
利用PHP实现短域名互转
2013/07/05 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python 的描述符 descriptor详解
2016/02/27 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
python 星号(*)的多种用途
2020/09/21 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
高中毕业生自我鉴定范文
2013/09/26 职场文书
关于爱情的广播稿
2014/01/16 职场文书
学习决心书范文
2014/03/11 职场文书
工程项目建议书范文
2014/03/12 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
校园活动策划方案
2014/06/13 职场文书
房屋出售授权委托书
2014/10/12 职场文书
五年级上册复习计划
2015/01/19 职场文书
新教师个人工作总结
2015/02/06 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
MySQL的存储过程和相关函数
2022/04/26 MySQL