【网络安全】二、入门篇:HTTP 协议进阶 ——GET/POST 常用传参方法详解

在理解 GET/POST 核心区别后,需掌握不同场景下的传参格式(参数如何组织、传递),这是后续漏洞测试(如 SQL 注入、命令注入)的基础。以下传参方法均基于本地搭建的测试网站。

一、本地自定义测试网站搭建步骤(PHPStudy + 简单 PHP 页面)

以下用 PHPStudy 搭建测试环境:​

步骤 1:安装 PHPStudy 并启动服务​

  • 下载 PHPStudy(官网:phpstudy.net),默认安装;
  • 打开 PHPStudy,点击「启动」(确保 "Apache" 和 "MySQL" 服务均为绿色运行状态);
  • 记住「网站根目录」(默认是D:\phpstudy_pro\WWW,后续所有 PHP 文件放此目录)。

步骤 2:创建测试文件夹与核心页面​

  • 在根目录下新建文件夹cmd_test(用于存放所有测试文件);
  • 在cmd_test中创建以下 6 个核心 PHP 文件:

(1)get_query.php(GET-Query String 传参)

php 复制代码
<?php
// 接收GET的Query String参数(?page=2&size=10)
$page = $_GET['page'] ?? '1'; // 若参数不存在,默认值1
$size = $_GET['size'] ?? '5';
echo "GET-Query String传参测试:<br>";
echo "当前页码:{$page},每页条数:{$size}";
?>

(2)get_path.php(GET - 路径参数传参)

php 复制代码
<?php
// 解析URL路径(如/user/1001/zhangsan)
$url = $_SERVER['REQUEST_URI']; // 获取当前URL路径(如/cmd_test/get_path.php/user/1001/zhangsan)
$path = explode('/', $url); // 按"/"分割路径为数组
// 提取路径中的参数(数组索引6和7对应user和1001,需根据实际路径调整)
$type = $path[3] ?? 'unknown'; // 第4段(索引3):参数类型(如user)
$id = $path[4] ?? '0'; // 第5段(索引4):用户ID
$name = $path[5] ?? '匿名用户'; // 第6段(索引5):用户名
echo "GET-路径参数传参测试:<br>";
echo "参数类型:{$type},用户ID:{$id},用户名:{$name}";
?>

(3)post_form.php(POST-application/x-www-form-urlencoded)

php 复制代码
<?php
// 接收POST表单参数(application/x-www-form-urlencoded)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    echo "POST-表单传参测试(application/x-www-form-urlencoded):<br>";
    echo "用户名:{$username},密码:{$password}";
    return;
}
?>
<!-- HTML表单,默认Content-Type为application/x-www-form-urlencoded -->
<form method="post" action="">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <button type="submit">提交</button>
</form>

(4)post_upload.php(POST-multipart/form-data 文件上传)

php 复制代码
<?php
// 接收POST文件上传参数(multipart/form-data)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $desc = $_POST['desc'] ?? ''; // 文本参数
    $file = $_FILES['file'] ?? []; // 文件参数($_FILES是PHP接收文件的专用数组)
    
    // 检查文件是否上传成功
    if ($file['error'] === UPLOAD_ERR_OK) {
        $uploadDir = './uploads/'; // 上传文件保存目录
        if (!is_dir($uploadDir)) mkdir($uploadDir); // 目录不存在则创建
        $savePath = $uploadDir . $file['name']; // 保存路径(原文件名)
        move_uploaded_file($file['tmp_name'], $savePath); // 移动临时文件到保存路径
        
        echo "POST-文件上传测试(multipart/form-data):<br>";
        echo "文件描述:{$desc}<br>";
        echo "文件名:{$file['name']}<br>";
        echo "文件大小:{$file['size']}字节<br>";
        echo "文件保存路径:{$savePath}";
    } else {
        echo "文件上传失败!错误码:{$file['error']}";
    }
    return;
}
?>
<!-- 文件上传表单,必须指定enctype="multipart/form-data" -->
<form method="post" action="" enctype="multipart/form-data">
    文件描述:<input type="text" name="desc"><br>
    选择文件:<input type="file" name="file"><br>
    <button type="submit">上传</button>
</form>

(5)post_json.php(POST-application/json 传参)

php 复制代码
<?php
// 接收POST-JSON参数(application/json,需手动读取请求体)
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && strpos($contentType, 'application/json') !== false) {
    // 读取请求体中的JSON字符串($_POST无法直接接收JSON,需用php://input)
    $json = file_get_contents('php://input');
    $data = json_decode($json, true); // 解析为关联数组(true表示返回数组而非对象)
    
    echo "POST-JSON传参测试(application/json):<br>";
    echo "接收的JSON数据:" . json_encode($data, JSON_UNESCAPED_UNICODE); // 格式化输出
} else {
    echo "请用POST方法并设置Content-Type: application/json";
}
?>

(6)cmd_test_base.php(基础页面,用于后续 CMD 命令测试)

php 复制代码
<?php
// 基础页面,后续命令注入测试会基于此修改
echo "本地测试网站基础页<br>";
echo "当前页面路径:" . __FILE__;
?>

步骤 3:验证环境是否正常​

  • 打开浏览器,访问:http://localhost/cmd_test/get_query.php?page=3&size=20
  • 若页面显示 "GET-Query String 传参测试:当前页码:3,每页条数:20",说明环境搭建成功;
  • 同理,测试其他页面(如post_form.php),确保表单提交、文件上传等功能正常。

二、GET 请求:3 种常用传参方式

GET 传参的核心是 "参数通过 URL 传递",但根据场景不同,参数位置和格式有差异,常见 3 种方式:​

1. 方式 1:Query String 参数(最通用,键值对拼 URL)​

  • 格式:URL?key1=value1&key2=value2(多个参数用&分隔)
  • 场景:搜索、分页、单条数据查询(如文章详情)
  • 实操案例(本地测试):

本地搭建测试页get_query.php,访问:​

bash 复制代码
http://localhost/cmd_test/get_query.php?page=2&size=10​

页面会输出当前页码:2,每页条数:10------ 参数被正确接收;​

  • 特殊字符处理:若参数含空格 / 中文(如name=张三),浏览器会自动 URL 编码为name=%E5%BC%A0%E4%B8%89(可在 Chrome 开发者工具「Network」中查看编码后参数)。

2. 方式 2:路径参数(RESTful API 常用,参数嵌 URL 路径)​

  • 格式:URL/参数1/参数2(无?和&,参数作为 URL 的一部分)
  • 场景:API 接口(如用户信息查询、资源获取)
  • 实操案例(本地测试):

本地搭建测试页get_path.php,访问:​

bash 复制代码
http://localhost/cmd_test/get_path.php/user/1001/zhangsan​

页面会输出用户ID:1001,用户名:zhangsan------ 通过解析 URL 路径获取参数;​

  • 工具测试:用 Postman 访问上述 URL,在「Params」中无需额外设置,直接通过路径传递参数。

3. 方式 3:URL 片段(Hash 参数,仅前端使用,不传给服务器)​

三、POST 请求:4 种常用传参方式

POST 传参的核心是 "参数在请求体中",不同场景对应不同的Content-Type(请求头中标识参数格式),服务器需按对应格式解析参数,常见 4 种方式:

1. 方式 1:application/x-www-form-urlencoded(表单默认格式)

  • 格式:key1=value1&key2=value2(与 GET 的 Query String 格式一致,但在请求体中)
  • 场景:普通表单提交(登录、注册、简单数据提交)
  • 实操案例(本地测试):

本地搭建测试页post_form.php(含 HTML 表单);

打开页面(http://localhost/cmd_test/post_form.php),输入 "用户名:admin,密码:123456",点击提交;

用开发者工具「Network」查看请求:

bash 复制代码
「Request Method」为 POST;
「Content-Type」为application/x-www-form-urlencoded;
「Form Data」中显示username=admin&password=123456。

2. 方式 2:multipart/form-data(文件上传专用格式)

  • 格式:请求体按 "边界" 分割参数,支持文本 + 文件混合传递
  • 场景:文件上传(头像、附件、图片)
  • 实操案例(本地测试):

本地搭建测试页post_upload.php(http://localhost/cmd_test/post_upload.php)(含文件上传表单);

选择一张图片(如test.png),输入 "文件描述:我的截图",点击上传;

抓包查看请求:

bash 复制代码
「Content-Type」为multipart/form-data; boundary=----WebKitFormBoundaryxxxx(boundary是参数分割标识);
「Form Data」中分为两部分:desc=我的截图(文本参数)和file=test.png(文件参数,含文件二进制数据);
页面会显示 "文件上传成功!保存路径:./uploads/test.png"。

3. 方式 3:application/json(API 接口主流格式)

  • 格式:JSON 字符串({"key1":"value1","key2":"value2"}),支持嵌套结构
  • 场景:前后端分离项目(Vue/React 调用 API)、复杂数据提交(如订单信息)
  • 实操案例(用 Postman 测试):

本地搭建测试页post_json.php(支持 JSON 解析)(http://localhost/cmd_test/post_json.php);

打开 Postman,新建 POST 请求,URL 为http://localhost/cmd_test/post_json.php;

bash 复制代码
「Headers」中添加Content-Type: application/json;
「Body」选择「raw」→「JSON」,输入:
{
  "user": {
    "id": 1001,
    "name": "张三"
  },
  "age": 25
}

点击「Send」,响应结果显示接收的JSON数据:{"user":{"id":1001,"name":"张三"},"age":25}------ 参数被正确解析。

4. 方式 4:text/plain(纯文本格式,较少用)

  • 格式:无固定结构,纯文本字符串(如直接传 "hello world")
  • 场景:简单文本传递(如日志上报、纯文本接口)
  • 实操:用 Postman 发送 POST 请求,Content-Type设为text/plain,请求体输入 "测试文本",服务器用file_get_contents('php://input')读取即可。
相关推荐
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954482 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star2 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954482 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
不可能的是3 天前
前端 SSE 流式请求三种实现方案全解析
前端·http
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行6 天前
网络安全总结
安全·web安全
red1giant_star6 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全