一、register_globals=Off和register_globals=On的区别

register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数.

register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同。

echo 'username::',$username;

echo '
sub::',$sub;

echo '
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的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。例子来源手册

// 当用户合法的时候,赋值

$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 作出相应的改动。

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() 之后调用。

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中register_global,PHP安全之register_globals的on和off的区别相关推荐

  1. Java中public,private,protected以及default的访问权限区别

    ** Java中public,private,protected以及default的访问权限区别 ** 首先,从public的字面意思上就能够知道public所指的是公共的,从而我们可以知道publi ...

  2. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用

    python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...

  3. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  4. python中定义变量和数组_Python中的线程和全局变量 - 数组和标准变量之间的区别?...

    我目前尝试使用线程编写一个更大的python程序,并遇到了数组不必被声明为全局的问题.Python中的线程和全局变量 - 数组和标准变量之间的区别? import numpy as np import ...

  5. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  6. 浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别

    举例浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别 demo Dom结构: <di ...

  7. OpenFOAM中:点,线,面,体的概念区别(尤其是face和patch的区别)

    OpenFOAM中:点,线,面,体的概念区别(尤其是face和patch的区别) 个人理解如下: face:有序点(point)的集合,物理面的概念 patch:边界面(face)的集合(非内部面), ...

  8. 软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别

    转:软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别 举个例子吧     if   A   and   B   then   Action1     if   C   or   D   then ...

  9. [html] http中的301、302、307、308有什么区别?

    [html] http中的301.302.307.308有什么区别? 301:永久移动302:发现307:临时重定向308:永久重定向 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, ...

最新文章

  1. 清华成果发布 | 广度学习基础计算系统集成平台
  2. 4个月高效备考信息系统项目管理师经验分享【57,49,49】
  3. redis缓存路由为空_Springboot使用RedisTemplate优雅地操作redis
  4. 生活随笔:态度需要端正
  5. 若非必要请勿直接使用@_
  6. Keras---text.Tokenizer:文本与序列预处理
  7. 缠论123买卖点主图公式_缠论主图指标的正确应用方式
  8. ug链轮设计软件_同为三维设计软件,solidworks与ug有何不同
  9. Windows下将jar包封装成服务程序
  10. 免费赠送2本新书《iOS程序员面试笔试真题与解析》
  11. CMS内容管理系统可行性分析
  12. linux centos Intel® Centrino® Wireless-N 1000 无线网卡的安装
  13. 讲座记录《捷联惯导解算的历史及发展》
  14. 小微个人网站如何接入免费短信验证码
  15. 转:量化投资新手指南-初识量化交易
  16. IIS发布网站及网页显示设置
  17. 美国范德堡大学计算机科学博士,范德堡大学计算机科学专业是什么?相关信息是哪些呢?...
  18. mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...
  19. python数据可视化(matplotlib条形图、饼图、箱状图、直方图、折线图)(代码)
  20. 银行信息技术岗面试总结----中信浦发工商建行

热门文章

  1. STM32 usb 设备实现自动重枚举
  2. STM32 基础系列教程 7 - 单脉冲PWM
  3. 一篇文章搞定Linux基础操作
  4. MT6573驱动开发日志之touchpanel .
  5. 【s操作】轻松优雅的保存微信群图片和朋友圈图片
  6. 计算机语言pandas,计算机语言python100道pandas(含答案)
  7. 【FPGA实现GA】基于FPGA的GA优化算法的设计与实现
  8. C++继承机制下的析构函数
  9. 如何禁止电脑某个程序运行(强制自律)
  10. 拯救react的hooks:react的问题和hooks的作用