Rumah > pembangunan bahagian belakang > tutorial php > 浅谈php可变变量安全

浅谈php可变变量安全

怪我咯
Lepaskan: 2023-03-10 20:58:01
asal
1591 orang telah melayarinya

变变量是PHP一个非常方便的特性,手册里已经说了,可变变量的意思就是一个变量的变量名可以动态的设置!
 那么变量的变量名可以动态设置会产生什么安全问题呢?下面来看看:

<?php
$a = &#39;phpinfo&#39;;
$a();
?>
Salin selepas log masuk

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

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

<?php
$a = &#39;phpinfo&#39;;
${$a()};
?>
Salin selepas log masuk

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

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

<?php
 
$a = "${${phpinfo()}}";
 
?>
Salin selepas log masuk

这是一个2个嵌套的可变变量,我们只是按照上面一个例子将可变变量的内容自己填写进去了,实际上就是把某个函数赋给某个变量,所以phpinfo函数最终执行了,也就化成了各种漏洞和webshell的原型!

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

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

<?php
$a = &#39;phpinfo()&#39;;
echo $a; //输出phpinfo()字符串
echo &#39;$a&#39;; //输出$a字符串
echo "$a"; //输出phpinfo()字符串
?>
Salin selepas log masuk

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

Atas ialah kandungan terperinci 浅谈php可变变量安全. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan