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 相关文章推荐
php 前一天或后一天的日期
Jun 28 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
php使用curl抓取qq空间的访客信息示例
Feb 28 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
PHP将HTML转换成文本的实现代码
Jan 21 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 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
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
JQuery常见节点操作实例分析
2019/05/15 jQuery
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
Python中xrange与yield的用法实例分析
2017/12/26 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
flask-restful使用总结
2018/12/04 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
Python 控制终端输出文字的实例
2019/07/12 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
教师党性分析材料
2014/02/04 职场文书
银行办公室岗位职责
2014/03/10 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
我的中国梦口号
2014/06/16 职场文书
管理标语大全
2014/06/24 职场文书
酒后驾车标语
2014/06/30 职场文书
给上级领导的感谢信
2015/01/22 职场文书
世界红十字日活动总结
2015/02/10 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
教师节班会开场白
2015/06/01 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python