assert()函数_Web渗透 之 PHP 函数

这篇博客主要介绍了PHP函数的使用,包括自定义函数的定义和调用、变量范围(局部、全局、静态)、参数传递方式、可变函数和内部函数。特别关注了assert()函数,它允许将字符串作为PHP代码执行,常用于渗透测试中的Web漏洞利用。

1a2687b8ac166cdff3383b521958b3e4.png

后台代码 - PHP 函数

函数就是可以完成固定功能的语句或语句集合,可以重复调用。

0x01 自定义函数

函数定义的语法

function 函数名([形式参数1,形式参数2,....形式参数n]){
    //函数体
    return 表达式;//也可以不返回,如果不写那么默认返回null
}
  • function 是PHP 的关键字,用于完成函数的定义
  • 函数名,避开PHP 关键字,命名规则与变量的命名规则相同。
  • 形参,给函数传递参数用的。
  • 函数体,执行函数功能的部分。
  • 返回值,返回给调用者,默认返回NULL。

函数的调用

  • 函数的调用需要遵循定义函数的时候写的规则,一一对应,将具体的实际参数传给定义函数时候写的形式参数!
  • 调用函数之后执行的过程是相对独立的,互不干扰,默认没有联系!
  • 执行完毕,返回调用的位置继续向下执行(非常重要的规则)
<?php
function a(){
    echo "This is function a!<br />";
}
function b(){
    echo "The function b is beginning<br />";
    a();
    echo "The function b end";
}
b();
?>

0x02 PHP变量的范围

局部变量

局部变量,就是在函数内部定义的变量,默认情况下,函数外部不能直接访问。

<?php
function test(){
    $a = 1;
}
test();
echo $a;    //Notice: Undefined variable: a 
?>

全局变量

全局变量就是脚本的任意位置(函数内部或者外部)都可以调用的变量。

<?php
$a = 10;
​
define("NAME","ajest");//常量,作用域是全局的
​
function test(){
    echo $a;    //Notice: Undefined variable: a
    global $a;  //声明变量来自于函数外部   
    echo $a;    //10
    echo "<br />";
    echo NAME;
}
test();
?>
  • 函数内部是没有办法直接调用函数外部的变量,如果要使用的话,需要进行声明,直接在变量前面添加关键字global 即可。

静态变量

静态变量,值不会随着函数销毁而销毁,而是会保存下来。相当于变量独立于函数存在。 应用:函数运行次数统计。

如果一个变量$a 通过static 关键字修饰的。函数会检测static $a 是否被定义过,如果是,不会再次定义,可以拿过来直接用。否则,重新定义初始化。

在脚本运行的时候,相当于单独开辟了一段内存空间(独立于函数存在的),用来存储静态变量。

<meta charset = "utf-8">
<?php
function test(){
    static $a = 0;++$a;
    echo "此函数第{$a}次运行"."<br />";
}
​
test(); 
//test();       
?>

0x03 参数的传递

按值传递参数

默认传参方式。

对形参的操作,不会改变实参的值。

<?php
function add($a,$b){        //形参
    $a++;
    echo $a+$b;
}
$a = 1;$b = 2;              //实参
add($a,$b);                 //4
echo "<br />".$a;           //1
?>

按引用传递参数

  • 在形参前面加& 按引用传递参数,相当于形式参数和实际参数指的是同一个人,只是名字不一样,对于形式参数的操作会直接影响到实际参数(变量);
<?php
function add(&$a,&$b){      //引用传参
    $a++;
    echo $a+$b;
}
$a = 1;$b = 2;
add($a,$b);                 //4
echo "<br />".$a;           //2
?>

函数的默认参数

可以给形式参数设置默认值,设置方法很简单直接赋值即可!

给函数默认值的时候,全都给。

<?php
function add($a = 0,$b = 0){
    echo "$a = ".$a;
    echo "<br />";
    echo "$b = ".$b;
    echo "<br />";
    echo '$a+$b = '.($a+$b);
    echo "<hr />";
}
add();              //0
add(2,3);           //5
add(3);             //
//add(,3);          //Parse error: syntax error, 
//add(3,);          //Parse error: syntax error,
add(1,2,3);         //3
?>

可变长度参数列表

PHP提供给我们的,可以直接使用

func_get_args();
func_get_arg();
func_num_args();

这三个函数可以使用在我们的自定义函数内部,能够返回给我们一些关于参数的信息!

<?php
function test(){
	//var_dump(func_num_args());//获取实际参数的个数。
	//var_dump(func_get_args());//以数组方式获取实际参数。
	var_dump(func_get_arg(3));//根据参数的偏移量,获取参数
	return 0;
}
test("ajest",24,true,85.9);
?>

0x04 可变函数(变量函数)

直接把函数赋值给变量,通过修改变量的值,可以实现动态调用。

PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号 ,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。

可变函数不能用于例如 echoprintunset()isset()empty()includerequireeval 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。

<?php
function test(){    
    echo "The func's name is:".__FUNCTION__;
    echo "<br />";
    echo func_get_arg(0);
}
//test('AJEST');
//$a = "test";
$a = 'assert';
$str = "phpinfo();";
$a($str);		//test(phpinfo();)
				//eval(phpinfo();)

?>

0x05 内部(内置)

函数,PHP 提供许多现成的函数或者结构,可以直接使用。

具体,可以参考PHP 手册。

eval()

eval() 是一个语句,将字符串当做PHP 代码来执行。

assert()

assert 是一个函数,将字符串当做PHP 代码来执行。

0x06 递归函数

递归函数即在函数内部自己调用自己的函数。

递归函数

  • 函数在被调用的执行过程中会在内存里面分配空间用于存储临时数据,那么函数在执行过程中默认之间时没有联系的(除了静态变量,引用传参,全局变量等)。函数内部的变量,默认都是局部变量,相互之间没有影响!
  • 递归函数,在函数的内部需要有适时结束函数运行的条件!
function test($n){
    echo $n.'&nbsp;';
    if($n>0){
        test($n-1);//自己内部调用自己,即 递归函数
    }else{
        echo '<-->';
    }
    echo $n.'&nbsp;';
}
test(3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值