PHP 预定义超全局变量 笔记/练习

预定义超全局数组变量

$_FILES 练习在最后

其他练习跟在每条笔记后

概述

  • 预定义:预定义变量是 PHP 已定义,可以直接使用
  • 超全局:作用域是全局,可以在脚本的任何地方(包括函数内部、外部)都可以进行访问

常用预定义超全局变量

参数名 功能
$_GET 通过 URL 接收 GET 方法传递的参数 该数组不仅对 method 为 GET 的请求有效,而是对所有带 quary string 的请求有效
$_POST 通过 URL 接收 POST 方法传递的参数 会将变量,包括变量名和变量值,以关联数组形式传入当前脚本
$GLOBALS 引用全局作用域中可用的全部变量,数组的键就是变量的名字
$_SERVER 服务器和执行环境信息
$_FILES 通过 POST 方式上传到当前脚本的项目的数组(接收文件上传信息)
$_COOKIE 通过 HTTPCookies 方式床底给当前脚本的变量的数组
$_SESSION 当前脚本可用 Session 变量的数组
$_REQUEST 默认情况下包含了 $_GET , $_POST$_COOIKE 数组
$_ENV 通过环境方式传递给当前脚本的变量的数组
$php_errormsg 前一个错误信息
$http_response_header HTTP 响应头
$argc 传递给脚本的参数数目
$argv 传递给脚本的参数数组

$_GET

  • 通过 URL 接收 GET 方法传递的参数。该数组不仅对 method 为 GET 的请求有效,而是对所有带 quary string 的请求有效

  • 说明

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

    php 复制代码
    <?php
        var_dump($_GET);
        ?>
  • GET 传参

    直接在 url 后加 ? 再加要传入的参数

    格式:url?参数

    多个参数用 & 连接

  • 复制代码
    http://127.0.0.1/get.php?name=gjl&password=123
    php 复制代码
    <?php
        var_dump($_GET);
        ?>

    其中,参数名 作为数组中的 key参数的值 作为数组的value接收

  • HttpRequest 报文

    http 复制代码
    GET /get.php?username=gjl&password=123 HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: close
    Upgrade-Insecure-Requests: 1
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
  • HttpResponse 报文

    http 复制代码
    HTTP/1.1 200 OK
    Date: Mon, 23 Oct 2023 06:25:51 GMT
    Server: Apache/2.4.18 (Win32) OpenSSL/1.0.2e PHP/5.3.29
    X-Powered-By: PHP/5.3.29
    Content-Length: 83
    Connection: close
    Content-Type: text/html
    
    array(2) {
      ["username"]=>
      string(3) "gjl"
      ["password"]=>
      string(3) "123"
    }

$_POST

  • 用于接收浏览器客户端 POST 方式传入的参数

  • 说明

    • $_POST 用于接受浏览器客户端用户 POST 方式传递过来的参数
    • POST 传参,参数在请求的正文
    • GET 传参在 url 中可见,POST 传参在 url 中不可见
    • 以 http 协议通信,都是明文传输
  1. 直接访问无传参

    php 复制代码
    <?php
        var_dump($_POST);
        ?>
  2. 传入 GET 参数,不显示传入参数

  3. 表单 post 传参

    • post.html 页面

      php 复制代码
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
      </head>
      <body>
          <form action="post.php" method="post">
              姓名:<input type="text" name="username">
              <br>
              密码:<input type="text" name="passwd">
              <input type="submit" value="提交">
          </form>
      </body>
      </html>
    • post.php 页面

    • 访问 post.html,输入参数

    • 点击提交,跳转输出参数

  4. HackBar 传参

  5. BP 拦截修改 POST 传参

    burpsuite 拦截修改 method 为POST 并添加传入的数据

    拦截修改前

    修改 method 为 POST 并在最后添加要传入的参数,并放包

    HttpRequest 报文

    http 复制代码
    POST /test.php HTTP/1.1
    Host: 127.0.0.1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 20
    
    name=gjl&password=123

    此时显示 POST 的参数

    HttpResponse 报文

    http 复制代码
    HTTP/1.1 200 OK
    Date: Mon, 28 Aug 2023 12:21:30 GMT
    Server: Apache/2.4.18 (Win32) OpenSSL/1.0.2e PHP/5.3.29
    X-Powered-By: PHP/5.3.29
    Content-Length: 78
    Connection: close
    Content-Type: text/html
    
    array(2) {
      ["name"]=>
      string(2) "gjl"
      ["password"]=>
      string(3) "123"
    }
  • 为了弥补 HTTP 协议的无状态性,保持用户会话的状态,需要使用 Cookie 技术。

  • cookie 的过程

    1. 用户提交账密
    2. 服务器进行身份认证
    3. 下发 cookie 以供认证
    4. 浏览器客户端所有请求都会携带 cookie 身份信息
    5. 整体流程体现为,保持了 HTTP 会话的状态性
  • 示例代码

    php 复制代码
    <?php
        var_dump($_COOKIE);
        ?>
  • 向浏览器写入 Cookie 信息

    在 console 控制台中写入

    javascript 复制代码
    document.cookie = "name=user_gjl";
    document.cookie = "password=123.com";

    再次输出 COOKIE

  • HttpRequest 报文

$_REQUEST

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

    $_REQUEST 数组在接收参数的时候会受到一个 PHP 选项的控制(request_order

    复制代码
    # /php.ini 配置文件中
    request_order = "GP"     //默认选项
    request_order = "GPC"
  • 示例代码

    php 复制代码
    <?php
        var_dump($_REQUEST);
        ?>
  • GET 传参

  • POST 传参

  • Cookie 传参

$GLOBALS

  • 代码

    php 复制代码
    <pre>
    <?php
        var_dump($GLOBALS);
    ?>
  • 效果

$_ENV

  • 代码

    php 复制代码
    <pre>
    <?php
        var_dump($_ENV);
    ?>
  • 效果

    为空

  • 更改 php 版本

  • 再次访问

$_FILES

  • 用来接收上传文件相关信息
函数利用
  • 相关参数

    变量 含义
    $_FILES['uploaded'] 用来保存文件上传信息的 uploaded 就是表单中文件域 <input> 标签的 name 属性的值
    $_FILES['uploaded']['name'] 上传文件的名字
    $_FILES['uploaded']['type'] 上传文件的类型
    $_FILES['uploaded']['tmp_name'] 上传文件存储在服务器中的缓存路径(在test.php下加sleep(秒数);则缓存中的内容不会立刻删除)
    $_FILES['uploaded']['error'] 错误代码
    $_FILES['uploaded']["size"] 上传文件的大小
  • 注意

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

    test.php

    php 复制代码
    <?php
        echo '<pre>';
        var_dump($_FILES);
        ?>
  • 文件上传

    在 DVWA 的文件上传中,将文件上传路径 action 改为 127.0.0.1/test.php

    点击上传

    查看接收的信息

    接收的信息(二维数组)

    php 复制代码
    array(1) {
      ["uploaded"]=>
      array(5) {
        ["name"]=>
        string(26) "QQ鎴浘20230828221443.png"
        ["type"]=>
        string(9) "image/png"
        ["tmp_name"]=>
        string(46) "C:\Users\LEGION\AppData\Local\Temp\phpAE3A.tmp"
        ["error"]=>
        int(0)
        ["size"]=>
        int(2198)
      }
    }
PHP 文件上传
  • 使用 POST 方法上传文件

  • 实现

    1. 利用 $_FILES 捕获文件上传信息

    2. 将缓存拷贝到目标路径下

      php 复制代码
      move_uploaded_file(缓存路径,目标路径);
  • 上传代码注意点

    1. 建立 <form> 表单,使用 PSOT 方法,action 属性为文件上传的路径,文件的 enctype 属性为 multipart/form-data
    2. <input file> 没有 name 属性,后台不能取得 Files
    php 复制代码
    <html>
    <head>
    	<meta charset="UTF-8">
    </head>
    <body>
    	<form action="#" method="post" enctype="multipart/form-data">
    	<!-- action='#' 提交到当前界面 -->	
    		<input type="file" name="file">
    		<input type="submit" value="submit" name="submit">
    	</form>
    </body>
    </html>
    <?php
    	echo"<pre>";
    	//var_dump($_FILES);
    	if(isset($_POST['submit'])){
    	// 如果检测到点击提交则执行以下代码
    		$name = $_FILES['file']['name'];
    		echo "File's name is {$name}<br>";
    		
    		$path = $_FILES['file']['tmp_name'];
    		echo "File's path is {$path}<br>";
    		
    		$save_path = "./{$_FILES['file']['name']}";
    		if(move_uploaded_file($path,$save_path)){
    			echo 'save success!<br />'.'save as ./'.$save_path;
    		}else{
    			echo "save failed";
    		}
    	}
    ?>
    • 上传成功

文件上传练习

  • 将前端代码和后端代码文件放在 phpstudy 的 www 目录下

前端代码 file.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="file.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file" id="">
        <input type="submit">
    </form>
</body>
</html>

后端代码 file.php

php 复制代码
<pre>
<?php
    var_dump($_FILES);
?>
  • 访问 127.0.0.1/file.html

    选择文件上传

  • 点击提交跳转至 file.php 显示上传结果信息

    文件上传后保存到临时目录中

文件上传后保存

  • 修改后的 file.php 代码

    php 复制代码
    <pre>
    <?php
        $tmp_path=$_FILES['file']['tmp_name'];
        // echo $tmp_path."<br>";
        $target_path="./{$_FILES['file']['name']}";
        // echo $target_path."<br>";
        if(move_uploaded_file($tmp_path,$target_path)){
            echo "upload to {$target_path} access!"."<br>";
        }else{
            echo "upload failed"."<br>";
        }
    ?>
  • 再次选择文件上传

  • 提交后返回

  • 此时打开 www 目录可以看到上传的图片文件

  • 打开,和上传的文件一模一样

相关推荐
dme.12 分钟前
Javascript之DOM操作
开发语言·javascript·爬虫·python·ecmascript
teeeeeeemo17 分钟前
回调函数 vs Promise vs async/await区别
开发语言·前端·javascript·笔记
加油吧zkf22 分钟前
AI大模型如何重塑软件开发流程?——结合目标检测的深度实践与代码示例
开发语言·图像处理·人工智能·python·yolo
tan77º26 分钟前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
ejinxian37 分钟前
PHP 超文本预处理器 发布 8.5 版本
开发语言·php
czhc114007566338 分钟前
Linux 76 rsync
linux·运维·python
福柯柯43 分钟前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩44 分钟前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子1 小时前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖1 小时前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera