香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 68|回复: 0

【后端代码审计】第二章 PHP 数组

[复制链接]

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-6-2 15:01:54 | 显示全部楼层 |阅读模式
数组概念


  • 了解PHP 中数组的概念
  • 掌握数组的创建方法
数组概述

学生信息

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

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

var_dump($stu1);
把学生信心存储在一个变量里,需要用数组来实现。
$name   = "AJEST";
$sex    = true;
$age    = 24;
$score  = 99.9;

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

echo "<pre>";
var_dump($stu1);
数组特点


  • 键值对(key-value);
  • 键,key,存储数组中,变量的“编号”。
  • 值,value,存储数组中,变量的值。
  • 数组中的元素可以是任意类型的数据对象。
  • 索引数组,变量的“编号”是整数,整数不具备一定的语义。
  • 关联数组,变量的"编号"用字符串表示,可以具备一定的语义。
$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() 函数来代替。
数组创建

直接赋值

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

$stu1['name'] = $name;      //key 一般是字符串,就是关联数组。
创建第二个学生信息。
$stu2['name'] = "HMM";
$stu2['sex'] = false;
$stu2['age'] = 22;
$stu2['score'] = 99.9;
array 语言结构

语法:
变量 = array(变量1,变量2,...);

变量 = array(
    'key1' => value1,
    'key2' => value2,
  ...
)

  • => 特殊的字符,在array 语言结构 中连接key 和value 。
  • 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 时,打印什么都没有。
多维数组

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

一个班级有四个学生。
$ns_class = array($stu1, $stu2, $stu3, $stu4);

echo "<pre>";
print_r($ns_class);
数组元素访问


  • 数组元素访问的基本方法
  • 掌握数组的遍历方法
数组元素操作

元素访问

通过key 找到数组中的元素。
echo "HMM's score is {$stu2['score']}";
echo "<br />";
echo "LL's score is {$ns_class[2][3]}";
元素操作

对元素的操作包括:
数组元素操作说明
读取通过key,捕获数组中的value。
修改直接赋值即可。
增加直接赋值即可。
删除PHP 中删除数组中的元素意义不大,置之不理即可。
尝试修改数组中的元素:
echo "李雷的成绩是 {$ns_class[2][3]}<br />";
echo "李雷努力学习中...<br />";
$ns_class[2][3] += 0.1;
echo "李雷的成绩是 {$ns_class[2][3]}";
尝试写一个座右铭:
$stu1['word'] = "为往圣继绝学,为万世开太平。";
var_dump($stu1);
数组的遍历

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

使用for 循环可以遍历数组,但是此种方法依赖于数组中key 自然数规律。
for ($i = 0; $i < count($stu1); $i++) {
    echo $stu1[$i]."<br />";
}
显然,此种方法具有局限性,只能遍历索引数组。
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 语言结构中,临时变量的名字可以变化,但是语言结构不能改变。
预定义超全局数组变量


  • 了解PHP 中预定义超全局数组变量的地位
  • 掌握相关数组的用法
概述

预定义,PHP 已经定义好了,已经存在的,可以直接拿过来使用。
超全局:超级全局变量,作用域是超全局,可以在脚本的任何地方访问和使用,包括函数内部、外部。
数组速查

名称作用
$_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默认情况下包含了$_GET,$_POST 和$_COOKIE 的数组。
$_ENV通过环境方式传递给当前脚本的变量的数组。
注意:

  • 以上数组都是预定义,超全局的。
  • 以上数组在不同的PHP 版本中有不同的表现,但是大方向没变。
$_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$_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$_COOKIE

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$_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);
$_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)
  }
}相关参数

变量含义
$_FILES['uploaded']用来保存文件上传信息的。
uploaded 就是文件域input 标签name 属性的值。
$_FILES['uploaded']['name']上传文件的名字。
$_FILES['uploaded']['type']上传文件的类型。
$_FILES['uploaded']['tmp_name']上传文件存储在服务器中的缓存路径。
$_FILES['uploaded']['error']错误代码。
$_FILES['uploaded']['size']上传文件的大小


  • $_FILES 中存储的与上传文件有关的信息,不是文件本身,文件内容在缓存路径中。
  • 正常完成文件上传功能,需要将文件的从缓存拷贝到服务器文件系统中。
文件上传

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

  • 利用$_FILES 数组捕获文件上传信息。
  • 将缓存中的文件拷贝到目标路径下。
朴素的代码:
<html>
    <head>
        <title>文件上传</title>
        <meta charset="utf8">
    </head>
    <body>
        <h1>文件上传测试</h1>
        <form action="#" method = "post" enctype="multipart/form-data">
            <input type="file" name = "uploaded">
            <input type="submit" value="submit" name="submit">
        </form>
    </body>
</html>

<?php

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

$img_path_tmp = $_FILES['uploaded']['tmp_name'];
echo "上传文件的缓存路径为:{$img_path_tmp}";

$img_path_target = "./images/{$_FILES['uploaded']['name']}";
echo "上传文件的目标路径为:{$img_path_target}";

move_uploaded_file($img_path_tmp, $img_path_target);完整代码:
<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>数组相关函数


  • 掌握数组相关函数的查询方法
  • 了解相关函数用法
函数作用
count()count($value, $mode): int
array_count_values()array_count_values(array $array): array
in_array()检查数组中是否存在某一个元素。
此函数可以应用于黑白名单策略。
array_key_exists()
array_search()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 03:35 , Processed in 0.632854 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表