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数组是否为空的代码
Sep 08 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
Yii2框架制作RESTful风格的API快速入门教程
Nov 08 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 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中source #N问题的解决方法
2014/01/27 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
python设置环境变量的原因和方法
2019/06/24 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
青年文明号创建承诺
2014/03/31 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
校园标语大全
2014/06/19 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
辞职信格式范文
2015/05/13 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python