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 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
php smarty函数扩展
Mar 15 PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 PHP
解析PHP提交后跳转
Jun 23 PHP
ajax返回值中有回车换行、空格的解决方法分享
Oct 24 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
php使用curl存储cookie的示例
Mar 31 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
Yii框架安装简明教程
May 15 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 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
Javascript中神奇的this
2016/01/20 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python获取糗百图片代码实例
2013/12/18 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
python中join()方法介绍
2018/10/11 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
什么是python的函数体
2020/06/19 Python
大数据分析用java还是Python
2020/07/06 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
关于Assembly命名空间的三个面试题
2015/07/23 面试题
学生会竞选自荐信
2013/10/12 职场文书
中学生校园广播稿
2014/01/16 职场文书
农民致富事迹材料
2014/01/23 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
教师节简报
2015/07/20 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
Python 匹配文本并在其上一行追加文本
2022/05/11 Python