PHP的可变变量名使用方法详解

有时候可变的变量名会给编程带来很大的方便,也就是说变量名可以被动态的命名和使用,通常变量通过下面这样的语句来命名,实例代码如下:

  1. <?php  
  2. $a = 'hello';  
  3. ?> 

可变变量名指的是使用一个变量的值作为这个变量的名称,在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样,实例代码如下:

  1. <?php  
  2. $$a = 'world';  
  3. ?> 

通过上面的两个语句,有两个变量被定义:变量$a,装的内容是”hello” 以及变量$hello,装的内容是 “world”,于是,下面的代码:

  1. <?php  
  2. echo "$a ${$a}";  
  3. ?> 

跟下面的语句的输出完全一致,代码如下:

  1. <?php  
  2. echo "$a $hello";  
  3. ?> 

它们都输出:hello world。

为了使用数组的可变变量名,你需要解决一个歧义问题,就是,如果你写$$a[1],解析器需要明白究竟你的意思是要把$a[1]当成一个变量,还是要把$$a当成变量、[1]指的是这个变量的索引,解决这个歧义问题的语法是:第一种情况使用${$a[1]},第二种情况使用${$a}[1]。

类属性也可以通过可变属性名来访问。可变属性名从产生调用所在的变量的访问范围内获取。例如,如果你的表达式是这样的:$foo->$bar,那么运行时将会在本地变量范围内寻找变量$bar,它的值将会做为$foo对象的一个属性名。如果$bar是个数组也可以使用。

例1可变变量名,代码如下:

  1. <?php  
  2.     class foo {  
  3.         var $bar = 'I am bar.';  
  4.     }  
  5.  
  6.     $foo = new foo();  
  7.     $bar = 'bar';  
  8.     $baz = array('foo''bar''baz''quux');  
  9.     echo $foo->$bar . "n";  
  10.     echo $foo->$baz[1] . "n";  
  11.     ?> 
  12. //上面的例子将会输出下面的结果: 
  13. //I am bar. 
  14. //I am bar. 

警告:请注意,可变变量名不能用于PHP函数和类里的超级全局数组变量上,变量$this也是一个不能动态取名的特殊变量。

浅谈PHP可变变量安全

变变量是PHP一个非常方便的特性,手册里已经说了,可变变量的意思就是一个变量的变量名可以动态的设置!

那么变量的变量名可以动态设置会产生什么安全问题呢?下面来看看:

  1. <?php 
  2. $a = 'phpinfo'
  3. $a(); 
  4. ?> 

这段代码很容易理解,变量的类型是字符型phpinfo,变量动态加上了(),于是变量变成了phpinfo函数动态执行了!

按照同样的原理我们引用手册中可变变量的例子:

  1. <?php 
  2. $a = 'phpinfo'
  3. ${$a()}; 
  4. ?> 
  5. $a() 

这个动态函数放入动态变量,当然我这个说法有点不专业,还是可变变量,我们会发现phpinfo函数还是执行了!

看过手册还有我给出的这个例子的话,大家一定觉得这个一点都不神奇,这就是PHP的语法特性,然后我们把这个东西再进化缩成一行:

  1. <?php 
  2. $a = "${${phpinfo()}}"
  3. ?> 
这是一个2个嵌套的可变变量,我们只是按照上面一个例子将可变变量的内容自己填写进去了,实际上就是把某个函数赋给某个变量,所以phpinfo函数最终执行了,也就化成了各种漏洞和webshell的原型!

看到这里大家应该知道了,为什么当初大牛们要我去看PHP手册吧,然而本文到这里就结束了么,咱还漏了一点,大牛说了安全就是基础,咱其实还没把这个东西搞清楚,为什么前面例子的变量是用的单引号,而后面的最终的例子用的是双引号,如果你想到了这个问题,我觉得你做安全肯定非常有潜力,以后保不准就是一大牛!

PHP中单引号和双引号的区别还是和变量有关,来看下面的例子,代码如下:

  1. <?php 
  2. $a = 'phpinfo()'
  3. echo $a//输出phpinfo()字符串 
  4. echo '$a'//输出$a字符串 
  5. echo "$a"//输出phpinfo()字符串 
  6. ?> 

双引号里的内容会再经过PHP的语法解析变量,而单引号里的内容就直接定性为字符串了!

所以本文到这里就真正结束了,于是大家应该也都明白了,当初牛人为什么和我说多看PHP手册和安全就是基础的深意。

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » PHP的可变变量名使用方法详解

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡