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正则校验用户名介绍
Jul 19 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
基于PHP文件操作的详解
Jun 05 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 PHP
php初始化对象和析构函数的简单实例
Mar 11 PHP
php中smarty区域循环的方法
Jun 11 PHP
ThinkPHP控制器详解
Jul 27 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
php实现学生管理系统
Mar 21 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 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文件上传(实例)
2013/10/27 PHP
用ADODB.Stream转换
2007/01/22 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
Python 深入理解yield
2008/09/06 Python
快速入手Python字符编码
2016/08/03 Python
Python中with及contextlib的用法详解
2017/06/08 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
会议活动邀请函
2014/01/27 职场文书
初三学习决心书
2014/03/11 职场文书
舞蹈专业求职信
2014/06/13 职场文书
先进典型发言材料
2014/12/30 职场文书
纪检监察立案决定书
2015/06/24 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
导游词之日本富士山
2020/01/06 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
vscode内网访问服务器的方法
2022/06/28 Servers