【网络安全】二、入门篇: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')读取即可。
相关推荐
AORO20253 小时前
三防手机是什么?有哪些值得购入的三防手机?
网络·5g·安全·智能手机·信息与通信
thginWalker3 小时前
安全系统架构
安全·系统架构
lingggggaaaa4 小时前
小迪安全v2023学习笔记(九十讲)—— 小程序篇&反编译&外在&主包分包&配置泄露&算法逆向&未授权
笔记·学习·安全·web安全·网络安全·小程序
乐予吕4 小时前
用 HTTP OPTIONS 发现 API 的隐藏能力
后端·http·api
独行soc6 小时前
2025年渗透测试面试题总结-90(题目+回答)
网络·python·安全·web安全·adb·渗透测试·安全狮
纠结的学渣6 小时前
信息安全基础知识:03密码学基础知识
安全
缘的猿7 小时前
Kubernetes 安全管理:认证、授权与准入控制全面解析
java·安全·kubernetes
乾博电子7 小时前
GFM100 地线连续性检测监控器:破解工业接地痛点,筑牢电力系统安全防线
安全·系统安全·在线监测·在线绝缘监测仪·地线连续性绝缘监测
CryptoCrawler8 小时前
文件包含与下载漏洞
网络·安全