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 相关文章推荐
基于数据库的在线人数,日访问量等统计
Oct 09 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
PHP中的事务使用实例
May 26 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
PHP查询分页的实现代码
Jun 09 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
php优化查询foreach代码实例讲解
Mar 24 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基础学习小结
2011/04/17 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
农历与西历对照
2006/09/06 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
实例讲解React 组件
2020/07/07 Javascript
Python SQLite3简介
2018/02/22 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
Python collections模块使用方法详解
2019/08/28 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
瑜伽国际:Yoga International
2018/04/18 全球购物
求职简历的自我评价
2014/01/31 职场文书
协议书模板
2014/04/23 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
政协委员个人总结
2015/03/03 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
历史博物馆观后感
2015/06/05 职场文书
培训简讯范文
2015/07/20 职场文书
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫