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 中即可
  • 传参示例

    
        var_dump($_GET);
        ?>
    

    PHP 预定义超全局变量 笔记/练习_第1张图片

  • GET 传参

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

    格式:url?参数

    多个参数用 & 连接

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

    PHP 预定义超全局变量 笔记/练习_第2张图片

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

  • HttpRequest 报文

    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/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. 直接访问无传参

    
        var_dump($_POST);
        ?>
    

    PHP 预定义超全局变量 笔记/练习_第3张图片

  2. 传入 GET 参数,不显示传入参数

    PHP 预定义超全局变量 笔记/练习_第4张图片

  3. 表单 post 传参

    • post.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="post.php" method="post">
              姓名:<input type="text" name="username">
              <br>
              密码:<input type="text" name="passwd">
              <input type="submit" value="提交">
          </form>
      </body>
      </html>
      

      PHP 预定义超全局变量 笔记/练习_第5张图片

    • post.php 页面

      PHP 预定义超全局变量 笔记/练习_第6张图片

    • 访问 post.html,输入参数

      PHP 预定义超全局变量 笔记/练习_第7张图片

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

      PHP 预定义超全局变量 笔记/练习_第8张图片

  4. HackBar 传参

  5. BP 拦截修改 POST 传参

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

    拦截修改前

    PHP 预定义超全局变量 笔记/练习_第9张图片

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

    PHP 预定义超全局变量 笔记/练习_第10张图片

    HttpRequest 报文

    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 的参数

    PHP 预定义超全局变量 笔记/练习_第11张图片

    HttpResponse 报文

    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"
    }
    

$_COOKIE

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

  • cookie 的过程

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

    
        var_dump($_COOKIE);
        ?>
    

    PHP 预定义超全局变量 笔记/练习_第12张图片

  • 向浏览器写入 Cookie 信息

    在 console 控制台中写入

    document.cookie = "name=user_gjl";
    document.cookie = "password=123.com";
    

    PHP 预定义超全局变量 笔记/练习_第13张图片

    PHP 预定义超全局变量 笔记/练习_第14张图片

    再次输出 COOKIE

    PHP 预定义超全局变量 笔记/练习_第15张图片

  • HttpRequest 报文

    PHP 预定义超全局变量 笔记/练习_第16张图片

$_REQUEST

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

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

    # /php.ini 配置文件中
    request_order = "GP"     //默认选项
    request_order = "GPC"
    

    PHP 预定义超全局变量 笔记/练习_第17张图片

  • 示例代码

    
        var_dump($_REQUEST);
        ?>
    
  • GET 传参

    PHP 预定义超全局变量 笔记/练习_第18张图片

  • POST 传参

    PHP 预定义超全局变量 笔记/练习_第19张图片

    PHP 预定义超全局变量 笔记/练习_第20张图片

  • Cookie 传参

    PHP 预定义超全局变量 笔记/练习_第21张图片

$GLOBALS

  • 代码

    <pre>
    <?php
        var_dump($GLOBALS);
    ?>
    
  • 效果

    PHP 预定义超全局变量 笔记/练习_第22张图片

$_ENV

  • 代码

    <pre>
    <?php
        var_dump($_ENV);
    ?>
    
  • 效果

    为空

    PHP 预定义超全局变量 笔记/练习_第23张图片

  • 更改 php 版本

    PHP 预定义超全局变量 笔记/练习_第24张图片

  • 再次访问

    PHP 预定义超全局变量 笔记/练习_第25张图片

$_FILES

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

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

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

    test.php

    
        echo '
    ';
        var_dump($_FILES);
        ?>
    
  • 文件上传

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

    PHP 预定义超全局变量 笔记/练习_第26张图片

    点击上传

    查看接收的信息

    PHP 预定义超全局变量 笔记/练习_第27张图片

    接收的信息(二维数组)

    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. 将缓存拷贝到目标路径下

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

    1. 建立
      表单,使用 PSOT 方法,action 属性为文件上传的路径,文件的 enctype 属性为 multipart/form-data
    2. 没有 name 属性,后台不能取得 Files
    <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"
    ";
    	//var_dump($_FILES);
    	if(isset($_POST['submit'])){
    	// 如果检测到点击提交则执行以下代码
    		$name = $_FILES['file']['name'];
    		echo "File's name is {$name}
    "
    ; $path = $_FILES['file']['tmp_name']; echo "File's path is {$path}
    "
    ; $save_path = "./{$_FILES['file']['name']}"; if(move_uploaded_file($path,$save_path)){ echo 'save success!
    '
    .'save as ./'.$save_path; }else{ echo "save failed"; } } ?>
    • 上传成功

    PHP 预定义超全局变量 笔记/练习_第28张图片

文件上传练习

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

前端代码 file.html

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

PHP 预定义超全局变量 笔记/练习_第29张图片

后端代码 file.php

<pre>
<?php
    var_dump($_FILES);
?>

PHP 预定义超全局变量 笔记/练习_第30张图片

  • 访问 127.0.0.1/file.html

    选择文件上传

    PHP 预定义超全局变量 笔记/练习_第31张图片

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

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

    PHP 预定义超全局变量 笔记/练习_第32张图片

文件上传后保存

  • 修改后的 file.php 代码

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

    PHP 预定义超全局变量 笔记/练习_第33张图片

  • 提交后返回

    PHP 预定义超全局变量 笔记/练习_第34张图片

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

    PHP 预定义超全局变量 笔记/练习_第35张图片

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

    PHP 预定义超全局变量 笔记/练习_第36张图片

你可能感兴趣的:(PHP,php,笔记,android,网络安全,linux,开发语言)