PHP中js global 全局变量量global和$GLOBALS的区别分析

php全局变量漏洞 $GLOBALS |Seay 渗透 编程 代码审计 网络安全博客
php全局变量漏洞 $GLOBALS
发表时间: 16:23:48&&&
在Discuz代码中有这么一段:
if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
exit('Request tainting attempted.');
register_globals 是php中的一个控制选项,可以设置成off或者on ,默认为off,决定是否将EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量。
如果register_globals打开的话, 客户端提交的数据中含有GLOBALS变量名, 就会覆盖服务器上的$GLOBALS变量.
所以 这段代码, 就是判断, 如果提交的数据中有GLOBALS变量名, 就终止程序。
由此引起的安全问题成为PHP的“自动全局变量漏洞”,所以我们要坚决把register_globals关掉。并且使用$_GET, $_POST, $_COOKIE 而非$_REQUEST 。
Discuz!论坛绕过全局变量防御漏洞由于php5.3.x版本php.ini的设置中request_order 默认值为GP ,导致Discuz! 6.x/7.x中可以绕过全局变量防御。
在include/global.func.php中:
function daddslashes($string, $force = 0) {
!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key =& $val) {
$string[$key] = daddslashes($val, $force);
$string = addslashes($string);
include/common.inc.php中:
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key =& $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
在register_globals=on时通过提交GLOBALS变量就可以绕过上面的代码。为了防范这种情况,Discuz!中有如下代码:
if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
exit('Request tainting attempted.');
$_REQUEST这个超全局变量的值受php.ini中request_order的影响,在最新的php5.3.x系列中,request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST而不包括$_COOKIE。通过COOKIE就可以提交GLOBALS变量。
临时解决方法:
更改php 5.3.x里的php.ini设置,设置request_order 为GPC 。
string substr ( string string, int start [, int length] )
其中start如果为负,则从字符串最后一个字符开始向回倒数到start字符,作为起始点。
如果length为负,则从字符串最后一个字符开始向回倒数到length字符,作为终点。
其中,如果字符串长度小于或等于start,则返回false。
如果起点位置超过终点位置,则返回一个空字符串。
set_magic_quotes_runtime(0)
在php.ini的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。
当然如果重复给溢出字符加反斜线,那么字符串中就会有多个反斜线,所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。
为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测设置状态秋决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉。
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的'"加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线()与 NUL(NULL 字符)。
error_reporting(0)
// Turn off all error reporting
error_reporting(0);
即关闭所有错误输出。
Powered by
Copyright (C)Seay 2013正文 深入理解php中$GLOBALS与global区别
深入理解php中$GLOBALS与global区别
发布时间: & 编辑:
jquery中文网为您提供深入理解php中$GLOBALS与global区别等资源,欢迎您收藏本站,我们将为您提供最新的深入理解php中$GLOBALS与global区别资源
&script&ec(2);&/script&
php中有一个不为很多人所用的超全局变量$GLOBALS。合理使用这个变量能使工作变得更加有效率,本篇文章主要分析一下这个超全局变量的用法以及$GLOBALS和global的区别。
$GLOBALS定义:引用全局作用域中可用的全部变量(一个包含了全部变量的全局组合数组。变量的名字就是数组的键),与所有其他超全局变量不同,$GLOBALS在PHP代码中任何地方总是可用的,自己可以通过打印$GLOBALS这个变量的结果就知道了。
global与$GLOBALS['']区别
$GLOBALS & 引用全局作用域中可用的全部变量
一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
在PHP生命周期中,定义在函数体外部的所谓全局变量,函数内部是不能直接获得的。如果要在函数体内访问外部定义的全局变量,可以通过global声明或者直接使用$GLOBALS来进行访问,例如:
$var1='www.111cn.net';
function test(){
&&& $var1='taobao';
&&& echo $var1,'&br /&';
&global $var1;
&echo $var1,'&br /&';
&&& echo $GLOBALS['var2'];
结果将打印为:
www.111cn.net
下面主要说明一下global和$GLOBALS的区别:
$GLOBALS['var']是外部的全局变量本身,而global $var是外部$var的同名引用或者指针,也就是说global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,而$GLOBALS[]确确实实调用的是外部的变量,函数内外会始终保持一致。
下面通过例子说明一下:
function test(){
&&& $GLOBALS['var2']=&$GLOBALS['var1'];
echo $var2;
打印结果为1
function test(){
&&& global $var1,$var2;
&&& $var2=&$var1;
echo $var2;
打印结果为2。为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。我们再来看一个例子吧。
function test(){
&&& unset($GLOBALS['var1']);
echo $var1;
因为$var1被删除了,所以什么东西都没有打印。
function test(){
&&& global $var1;
&&& unset($var1);
echo $var1;
打印结果为1。证明删除的只是别名|引用,起本身的值没有受到任何的改变。也就是说global $var其实就是$var=&$GLOBALS['var']。调用外部变量的一个别名而已。&/td&
&/table&您可能感兴趣的文章:安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&标签:至少1个,最多5个
单一个global是一个关键字,通常附加在变量前,用于将变量声明至全局作用域;$GLOBALS是预定义的超全局变量,把变量扔到里边的话一样可以带到全局去。
$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
细节:PHP释放全局变量注意事项
global $var
指函数外部同名变量的引用
$GLOBALS['var'] :
指函数外部变量本身
function one(){
global $a;
unset($a);
// 输出 100
/*******************************/
function two(){
unset($GLOBALS['a']);
// 输出 Notice: Undefined variable: a
global $ 等价于 $var = &$GLOBALS['var'];在函数内释放一个全局变量,应该这样:unset($GLOBALS['var']);而不能这样:global $ unset($var);
$var = 'abc';
unset($tmp); //当你unset一个引用,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了.
echo $ //输出abc
0 收藏&&|&&2
你可能感兴趣的文章
14 收藏,2.3k
3 收藏,540
1 收藏,583
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:
扫扫下载 App9864人阅读
今天在写框架的时候想把SaeMySQL初始化之后作为全局变量使用。
但是后来发现PHP中的全局变量和Java或者OC中的全局变量还是有较大区别的。
下面记录一下php里面的global的使用相关注意事项。
1.有些场合需要全局变量的出现,如下例子:
$name=&why&;//定义变量name,并初始化
function echoName()
//试图引用函数外面的变量
echo &myname is &.$name.&&br&&;
echoName();
上面的代码的结果为:&myname is& 。而不是期望中的:&myname is why&。因为函数没有传递参数$name的&#20540;,企图引用外部变量,不会成功。这时候考虑使用global。
2.于是将上述代码改为
global $name=&why&;//用global声明的同时赋值
function echoName()
//试图引用函数外面的变量
echo &myname is &.$name.&&br&&;
echoName();
结果为:Parse error: syntax error, unexpected '=', expecting ',' or ';' in http:\\ on line 2
也即上述代码有错误。原因是不能在用global声明变量的同时给变量赋&#20540;。
3.再次更改上述代码:
$name=&why&;//将global声明与赋值分开
function echoName()
//试图引用函数外面的变量
echo &myname is &.$name.&&br&&;
echoName();
但是得到的结果依然为:&myname is& ,原因是global的用法不对。
global的正确用法是:&在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。& 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。
4.于是进一步改动上述代码:
$name=&why&;//定义变量name,并初始化
function echoName()
//通过global来声明$name,相当于传递参数
echo &myname is &.$name.&&br&&;
echoName();
此时得到期望中的结果:&myname is why&。
以上代码说明,global是起传递参数的作用,而并非使变量的作用域为全局。
5.以下代码证明了这一点:
$name=&why&;//声明变量$name,并初始化
function echoName1()
//在函数echoName1()里使用global来声明$name
echo &the first name is &.$name.&&br&&;
function echoName2()
//在函数echoName2()里没有使用global来声明$name
echo &the second name is &.$name.&&br&&;
echoName1();
echoName2();
the first name is why
the second name is
上面的结果说明在函数echoName2()中,$name变量仍然是未知的,因为没有用global来声明,也就没有传递进去。同时也证明了global的作用并不是使变量的作用域为全局。
综上,global的作用就相当于传递参数,在函数外部声明的变量,如果在函数内想要使用,就用global来声明该变量,这样就相当于把该变量传递进来了,就可以引用该变量了。
当然,除了通过上述方法外,还可以使用全局数组$GLOBALS来解决问题,在需要用到外部变量的地方,使用$GLOBALS['var']就可以了。例:
$name=&why&;//定义变量name,并初始化
function echoName()
//通过全局数组$GLOBALS来引用外部变量
echo &myname is &.$GLOBALS['name'].&&br&&;
echoName();
得到的结果为:&& myname is why 。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2825492次
积分:19879
积分:19879
排名:第396名
原创:272篇
转载:15篇
译文:14篇
评论:1120条
各位实在抱歉,不再继续维护 CSDN 博客。
新博客地址:
感谢 CSDN 陪我走过的三年时光。
文章:12篇
阅读:27855
文章:12篇
阅读:1473276
文章:23篇
阅读:100386
文章:35篇
阅读:246135
(1)(2)(2)(1)(2)(11)(3)(3)(15)(6)(2)(1)(3)(5)(15)(13)(5)(4)(4)(3)(19)(12)(26)(36)(41)(28)(38)

我要回帖

更多关于 全局变量和局部的区别 的文章

 

随机推荐