后端代码审计——PHP数组

PHP数组

数组特点

  • 键值对(key-value)。
  • 键,key,存储数组中,变量的“编号”。
  • 值,value,存储数组中,变量的值。
  • 数组中的元素可以是任意类型的数据对象。
  • 索引数组,变量的“编号”是整数,整数不具备一定的语义。
  • 关联数组,变量的"编号"用字符串表示,可以具备一定的语义。

1. 索引数组

$name   = "AJEST";
$sex    = true;
$age    = 24;
$score  = 99.9;

$stu1[] = $name;
$stu1[] = $sex;
$stu1[] = $age;
$stu1[] = $score;

echo "<pre>";
var_dump($stu1);

2. 关联数组

$name   = "AJEST";
$sex    = true;
$age    = 24;
$score  = 99.9;

$stu1['name'] = $name;
$stu1['sex'] = $sex;
$stu1['age'] = $age;
$stu1['score'] = $score;

echo "<pre>";
var_dump($stu1);
  • 复合数据类型,非线性。
  • 输出数组的时候不能使echo 语句,可以使用print_r() 函数来代替。

3. 数组创建

3.1 直接赋值

语法:

$stu1[] = $name;            //默认是索引数组,从0开始计数。

$stu1['name'] = $name;      //key 一般是字符串,就是关联数组。

3.2 array 语言结构

语法:

变量 = array(变量1,变量2,...);

变量 = array(
    'key1' => value1,
    'key2' => value2,
  ...
)
  • => 特殊的字符,在array 语言结构 中连接keyvalue
  • PHP 中数组的key 如果是字符串就具备一定的语义,可以非常方便的了解变量的含义。
  • PHP 数组中的key ,不建议使用除了整型和字符串的其他类型。
  • array() 不是函数,而是一种语言结构。

例如:

$stu3 = array('LL', true, 25, 59.9);

$stu4 = array(
    'name'  => 'LH',
    'sex'   => true,
    'age'   => 24,
    'score' => 90.0
);

print_r($stu4);

print_r 与echo 类似,在输出布尔类型变量True 时,打印的是1;在输出False 时,什么都不打印。

image-20230817154142945

4. 多维数组

数组中的元素可以是任何类型的数据。数组中的元素也可以是数组

4.1 创建多维数组

例如:一个班级有四个学生

$ns_class = array($stu1, $stu2);

echo "<pre>";
print_r($ns_class);

5. 数组元素访问

5.1 组元素操作

元素访问通过key 找到数组中的元素

echo $stu3[3];				# 访问索引数组 
echo "<br/>";
echo $ns_class[1]["score"];	# 访问多维数组中的关联数组

5.2 元素操作

对元素的操作包括:

数组元素操作说明
读取通过key,捕获数组中的value。
修改直接赋值即可。
增加直接赋值即可。
删除PHP 中删除数组中的元素意义不大,置之不理即可。

尝试修改数组中的元素:

echo "ls的成绩是 {$ns_class[1]["score"]}<br />";
$ns_class[1]["score"] += 0.1;
echo "ls的成绩是 {$ns_class[1]["score"]}";

5.3 数组的遍历

遍历数组,就是数组中的每个元素都访问一次

5.4 for 循环

使用for 循环可以遍历数组,但是此种方法依赖于数组中key 自然数规律。

for ($i = 0; $i < count($stu1); $i++) { 
    echo $stu1[$i]."<br />";
}

5.5 foreach 语句

foreach 语法结构提供了遍历数组的简单方式。

foreach 这种语言结构是专门用来遍历数组的,foreach 是一种循环,不需要额外计时器。

foreach ($variable as $key => $value) {
    # code...
}

直接访问数组的值:

foreach ($stu2 as $v) {
    echo $v."<br />";
}

访问键值对:

foreach ($stu2 as $k => $v) {
    echo $k. " = ". $v. "<br />";
}

注意

  • foreach 是用来遍历数组的循环语言结构,数组中多少个元素,该语言结构就会循环执行几次。
  • foreach 语言结构中,临时变量的名字可以变化,但是语言结构不能改变。

6. 预定义超全局数组变量

预定义,PHP 已经定义好了,已经存在的,可以直接拿过来使用。

超全局:超级全局变量,作用域是超全局,可以在脚本的任何地方访问和使用,包括函数内部、外部。

6.1 数组速查

名称作用
$_GET通过URL 参数(又叫query string)传递给当前脚本的变量的数组。 注意:该数组不仅仅对method 为 GET 的请求生效,而是会针对所有带query string 的请求。
$_POST当HTTP POST 请求的Content-Type 是application/x-www-form-urlencoded 或multipart/form-data 时,会将变量以关联数组形式传入当前脚本。
$GLOBALS关联数组array,包含当前脚本内定义成全局范围的所有变量的引用。数组的键就是变量的名字。
$_SERVER服务器和执行环境信息。
$_FILES通过HTTP POST 方式上传到当前脚本的项目的数组。此数组的概况在POST 方法上传 章节中有描述。
$_COOKIE通过HTTP Cookies 方式传递给当前脚本的变量的数组。
$_SESSION当前脚本可用 SESSION 变量的数组。更多关于如何使用的信息,参见Session 函数 文档。
$_REQUEST默认情况下包含了 G E T , _GET, GET_POST 和$_COOKIE 的数组。
$_ENV通过环境方式传递给当前脚本的变量的数组。

注意

  • 以上数组都是预定义,超全局的。
  • 以上数组在不同的PHP 版本中有不同的表现,但是大方向没变。

6.2 $_GET

示例代码

//  get.php

var_dump($_GET);

说明

  • $_GET 是一个预定义数组。
  • 作用域是超全局,脚本的任何地方都可以使用。
  • 接收从浏览器客户端用户GET 方式传递到服务器的参数。
  • GET 传参的参数名做$_GET 数组的key,参数值作为数组的value。
  • GET 传参时,直接将参数拼接到URL 中即可。

GET 传参

GET /php/functions/get.php?username=AJEST&password=654321 HTTP/1.1
Host: localhost

示例

<?php
	echo "<pre>";
	// var_dump($_GET);
	print_r($_GET);
?>

浏览器URL中输入:

image-20230817155603696

回车后浏览器显示效果如下:

image-20230817155619859

6.3 $_POST

示例代码

// post.php

var_dump($_POST);

说明

  • $_POST 用于接收浏览器客户端用户以POST 方式传递过来的参数。
  • POST 传参,参数在请求正文中。

POST 请求

POST /php/functions/post.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=AJEST&password=123456

示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>wuhu</title>
</head>
<body>
	<form method="post" action="5.php">
        <p>
            名称:<input name="user" type="text" maxlength="5">
        </p>
        <p>
            密码:<input name="pass" type="password" >
        </p>
        <input type="submit" name="button" value="提交"/>
    </form>    
</body>
</html>
<?php
	echo "<pre>";
	print_r($_POST);
?>

浏览器页面显示

image-20230817155912775

点击提交后页面显示如下:

image-20230817160036530

6.4 $_COOKIE

为了弥补HTTP 协议的无状态性,保持用户的会话状态,需要使用Cookie 技术。

Cookie 过程:

  • 用户提交账密
  • 服务器进行身份认证
  • 下发身份证,下发Cookie。
  • 浏览器客户端用户所有的请求都会携带身份信息,携带Cookie 信息。
  • 整体流程体现为,保持了HTTP 会话的状态性。

示例代码

//  cookie.php

var_dump($_COOKIE);

写入Cookie

//console
document.cookie = "username=admin";
document.cookie = "passoword=123456";

HTTP 请求报文:

GET /php/functions/cookie.php HTTP/1.1
Host: 10.4.7.187
Cookie: username=admin; password=123456

示例:

使用bp抓包,修改数据包

image-20230817160228269

浏览器页面显示如下:

image-20230817160254865

6.5 $_REQUEST

$_REQUEST,默认包含了$_GET,$_POST,$_COOKIE 数组中的所有变量。以上提到的三个数组,包含了浏览器客户端的三大传参方式,也称GPC。

但是$_REQUEST 数组在接收参数的时候,会受到一个PHP 选项的控制。

# /php/php-5.4.45/php.ini

request_order = "GP"
;request_order = "GPC"

示例代码

//request.php

var_dump($_REQUEST);

6.6 $_FILES

示例代码:

// files.php

echo "<pre>";
var_dump($_FILES);

接收的信息:

array(1) {
  ["uploaded"]=>
  array(5) {
    ["name"]=>
    string(14) "1_yjh_info.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(53) "C:\Users\Administrator\AppData\Local\Temp\php990E.tmp"
    ["error"]=>
    int(0)
    ["size"]=>
    int(14148)
  }
}

6.7 相关参数

变量含义
$_FILES[‘uploaded’]用来保存文件上传信息的。 uploaded 就是文件域input 标签name 属性的值。
$_FILES[‘uploaded’][‘name’]上传文件的名字。
$_FILES[‘uploaded’][‘type’]上传文件的类型。
$_FILES[‘uploaded’][‘tmp_name’]上传文件存储在服务器中的缓存路径。
$_FILES[‘uploaded’][‘error’]错误代码。
$_FILES[‘uploaded’][‘size’]上传文件的大小
  • $_FILES 中存储的与上传文件有关的信息,不是文件本身,文件内容在缓存路径中。
  • 正常完成文件上传功能,需要将文件的从缓存拷贝到服务器文件系统中。

6.8 文件上传

文件上传的实现,可以有以下步骤:

  • 利用$_FILES 数组捕获文件上传信息。
  • 将缓存中的文件拷贝到目标路径下。

代码:

<html>
    <head>
        <title>文件上传</title>
        <meta charset="utf8">
    </head>
    <body>
        <h1>文件上传测试</h1>

<?php

// echo "<pre>";
// var_dump($_FILES);

if(isset($_POST['submit'])){
    $img_path_tmp = $_FILES['uploaded']['tmp_name'];
    echo "上传文件的缓存路径为:{$img_path_tmp}<br />";

    $img_path_target = "./images/{$_FILES['uploaded']['name']}";

    if(move_uploaded_file($img_path_tmp, $img_path_target)){
        echo "文件上传成功!";
        echo "上传文件的目标路径为:{$img_path_target}";
    }else {
        echo "文件上传失败!";
    }
}else{

$html = <<<FORM
<form action="#" method = "post" enctype="multipart/form-data">
<input type="file" name = "uploaded">
<input type="submit" value="submit" name="submit">
</form>
FORM;
    echo $html;
}
?>
    </body>
</html>

说明:

  • isset():判断是否为空。

  • move_uploaded_file():用于将上传的文件移动到指定的目标位置。

7. 数组相关函数

函数作用
count()count($value, $mode): int
array_count_values()array_count_values(array $array): array
in_array()检查数组中是否存在某一个元素。 此函数可以应用于黑白名单策略。
array_key_exists()用于检查数组中是否存在指定的键名
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来日可期x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值