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 4.2书写安全的脚本
Oct 09 PHP
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php+mysqli事务控制实现银行转账实例
Jan 29 PHP
php实现过滤UBB代码的类
Mar 12 PHP
php删除指定目录的方法
Apr 03 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
Sep 26 PHP
分享一个漂亮的php验证码类
Sep 29 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 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实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
详解python中递归函数
2019/04/16 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
枚举与#define宏的区别
2014/04/30 面试题
办公文员的工作岗位职责
2013/11/12 职场文书
售后服务经理岗位职责范本
2014/02/22 职场文书
新闻发布会主持词
2014/03/28 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
美术教师个人工作总结
2015/02/06 职场文书
护理专业自我评价
2015/03/11 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书