PHP 伪协议:使用 php://input 访问原始 POST 数据

文章目录

  • 参考
  • 环境
  • PHP 伪协议
      • 概念
      • 为什么需要 PHP 伪协议?
  • php://input
      • 为什么需要 php://input?
          • 更灵活的数据处理
          • 减小性能压力
      • 发送 POST 数据
        • HackBar
          • HackBar 插件的获取
        • $_POST
          • 打开 HackBar 插件
          • 通过 HackBar 插件发起 POST 请求
      • 基操
  • enable_post_data_reading
      • enable_post_data_reading 配置项
      • 为什么 PHP 要提供 enable_post_data_reading 配置项?
          • 减小性能压力
          • 使得 php://input 能够获取 multipart/form-data 类型的 POST 数据
            • multipart/form-data
            • 原因
  • 不必要的 POST
      • `php://input` 的独立性
      • `GET 请求也可以携带请求体`

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 官方ini.core.php
PHP 官方PHP Manual

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9
PHP 编辑器PhpStorm 2023.1.1(专业版)

PHP 伪协议

概念

在 PHP 中,伪协议(Pseudo Protocols) 也被称为 流包装器,这些伪协议以 php:// 开头,后面跟着一些参数,用于指定 要执行的操作需要访问的资源
伪协议表明这些协议并不是一个 真实的外部协议,例如 httpftp。PHP 伪协议的出现是为了提供一个 统一的简洁的 接口来处理 不同的数据流。这些伪协议可以被看作是一种 桥梁,它们允许开发者 使用常规的文件操作函数来处理各种不同的数据流

为什么需要 PHP 伪协议?

PHP 所提供的伪协议带来的优点整理如下:

项目描述
一致性开发者 不必为不同的数据流编写特定的处理代码。通过使用伪协议,开发者能够使用 熟悉的标准的 文件操作函数来处理各种数据。
灵活性伪协议提供了 多种不同的方式来访问和处理数据例如,您可以使用 php://stdinphp://stdout 来处理标准输入和标准输出;使用 php://memoryphp://temp 来在内存中或临时文件中处理数据。这种灵活性允许开发人员根据具体需求选择最合适的方式来处理数据。
优化工作流php://input 伪协议可以 直接读取原始的 POST 数据,而不需要依赖特定的全局变量,这样可以在不同的上下文中更灵活地处理输入数据;php://tempphp://memory 伪协议允许在内存中 创建临时数据流,而 无需实际文件存储。这对于处理临时数据或进行中间数据处理非常有用,而 不会产生硬盘 I/O开销。

php://input

为什么需要 php://input?

php://input 是 PHP 提供的一个伪协议,允许开发者 访问 POST 请求的原始内容。对于 POST 请求数据,PHP 提供了 $_POST$FILES 超全局变量,在客户端发起 POST 请求时,PHP 将自动处理 POST 提交的数据并将处理结果存放至 $_POST 与 $FILES 中。既然 PHP 已经提供了 更为高效的 $_POST 与 $FILES,为什么还要给出 php://input 伪协议来访问原始 POST 请求数据呢?🧐

更灵活的数据处理

PHP 的 默认行为 是自动解析 POST 数据,并将解析结果填充至 $_POST$_FILES 超全局变量中。但在现代的 WEB 开发中,存在许多常用的数据格式,例如 JSONXML。通过 php://input,开发者可以直接访问这些数据,然后 根据需要进行适当的处理和解析

减小性能压力

在某些情况下,可能 不需要一次性处理整个 POST 数据,或者希望以流的方式处理数据以 节省内存。在使用 php://input 读取 POST 原始数据的过程中,可以使用 流处理函数进行逐块读取,而不是一次性将 POST 数据加载至内存中。

发送 POST 数据

由于 php://input 与 POST 存在关联,为了方便后续的研究,我们需要一个工具来发起 POST 请求。推荐使用浏览器插件 HackBar

HackBar

Hackbar 是一个 浏览器扩展,该扩展工具为安全专家、渗透测试人员和开发人员提供了一组工具,用于测试和评估 Web 应用程序的安全性HackBar 可以帮助用户识别潜在的安全漏洞,进行渗透测试,以及执行各种与网络安全相关的任务。以下是 Hackbar 的一些 主要 特点和功能:

  1. HTTP 请求和响应拦截
    HackBar 允许用户 查看编辑浏览器发送的 HTTP 请求报文及接收到的 HTTP 响应报文。在需要的时候,你可以通过 修改 HTTP 请求报文 来实现 对请求的精细化控制

  2. Cookie 编辑和管理
    HackBar 允许用户轻松编辑和管理浏览器中的 Cookie,这对于模拟不同的用户会话非常有用。

  3. 表单处理
    HackBar 提供了表单提交和数据包装功能,以帮助用户测试应用程序的输入验证和表单处理。你 可以手动构建 POST 或 GET 请求,并查看服务器对此进行的响应

  4. 编码和加密工具
    HackBar 包括一些编码和加密工具,可用于处理 Base64MD5SHA1 等的相关数据。

  5. XSS 攻击测试
    HackBar 提供了一些工具,用于 检测和测试跨站脚本(XSS)漏洞

  6. SQL 注入测试
    HackBar 还包括用于 测试 SQL 注入漏洞 的工具,可以帮助用户评估 Web 应用程序的数据库安全性。

由于微软的 Edge 浏览器的插件官网没有提供 HackBar 这款扩展工具,而 Google 的 Chrome 浏览器的插件官网由需要科学上网,所以推荐需要这款插件的朋友可以使用 Firefox 浏览器。

HackBar 插件的获取

首先,打开 Firefox 浏览器并进入其 插件官网,搜索插件 HackBar,你将得到如下类似界面。

选择图中 红色箭头指向的两个插件中的其中一个 进行安装即可。

$_POST
<?php# 超全局变量 $_POST 保持着一个关联数组
var_dump($_POST);# 输出一个具有换行功能的 HTML 标签
echo '</br>';# 获取名为 X 的 POST 参数的值
var_dump($_POST['X']);

访问上述 PHP 页面,你将得到如下内容:

PHP 解释器抛出了 Notice 异常信息,这是由于我们还未提交 POST 数据,导致 $_POST['X'] 正在 尝试访问一个不存在的元素 从而引发了异常。

打开 HackBar 插件

右键 当前页面,得到如下类似界面:

点击其中的 检查,得到如下类似界面:

选择其中的 HackBar 分栏,得到如下类似界面:

通过 HackBar 插件发起 POST 请求

点击 LOAD 按钮 加载与当前页面相关的 URL 至输入框中,当然你也可以自己输入 URL,URL 所指向的页面是插件将处理的页面,不一定需要是当前页面的 URL。

点击 Use POST method 旁边的按钮尝试进行 POST 请求,enctype 下拉框中提供了 可供选择的 POST 请求数据的编码方式

默认选项 application/x-www-form-urlencode 允许我们使用 同 URL 查询字符串相同的格式编写 POST 数据。于是构造如下 POST 数据:

name=RedHeart&X=BinaryMoon&special_symbol=%26%25%24

点击 EXECUTE 发起请求,得到如下类似界面:

基操

php://input 提供了一个方式来 读取 POST 请求 的原始内容。对此,请参考如下实例:

index.php

<?php# 尝试通过 php://input 协议获取原始 POST 数据
$raw_data = file_get_contents('php://input');
var_dump($raw_data);# 通过输出 HTML 标签 </br> 实现换行功能
echo '</br>';# 经 PHP 整理的 POST 数据
var_dump($_POST);

执行效果

在执行上述示例程序后,php://input 获取了 POST 请求过程中提交的原始数据,而 $_POST 则提供了一个经 PHP 处理 POST 数据后得到的关联数组。

enable_post_data_reading

enable_post_data_reading 配置项

enable_post_data_reading 是 PHP 中的一个布尔配置项,该配置项决定了 是否在 PHP 启动时读取和解析 POST 数据以填充 $_POST 与 $_FILES 超全局变量。在 默认情况 下,enable_post_data_reading 是 开启 的。

为什么 PHP 要提供 enable_post_data_reading 配置项?

减小性能压力

在使用 php://input 读取 POST 原始数据的过程中,可以使用 流处理函数进行逐块读取,而不是一次性将 POST 数据加载至内存中。而通过将 enable_post_data_reading 配置项关闭,则可以防止 PHP 的读取与解析。否则,即使您通过 php://input 以流的形式逐块读取,PHP 也将一次性读取并将 POST 数据解析至 $_POST$_FILES 超全局变量中。

使得 php://input 能够获取 multipart/form-data 类型的 POST 数据
multipart/form-data

multipart/form-data POST 请求中的一种 Content-Type,常用于与文件上传相关的数据传输。multipart/form-data 允许你将表单中的内容编码为多个部分的 主体(HTTP 请求体),每一部分通常代表一个表单字段,每个部分都包含自己的 头部信息和数据

为了更好地理解 multipart/form-data,我们可以逐步分解它:

  1. multipart
    multipart 意味着 POST 主体中包含多个数据部分,每个部分之间通过边界进行分隔。

  2. form-data
    form-data 表明数据来源于一个 HTML 表单

  3. 边界
    当指定 multipart/form-data 作为内容类型时,会有一个 boundary 参数与之关联。boundary 参数用于指定边界,边界是一个随机生成的字符串,与消息主体的任何部分冲突。

  4. 每个部分的大致结构
    POST 数据(HTTP 请求体) 的每个部分都有自己的一组 头部信息(HTTP 请求头),后跟一个空行和数据。

    • 对于普通的表单字段,数据就是字段的值。
    • 对于文件上传等功能,数据是文件的描述信息及文件所包含的内容。

举个栗子

假设你有一个表单,其中包含一个名为 username 的文本字段和一个名为 profile_picture 的文件字段。当用户填写 Alice 并上传一张图片后,HTTP 请求报文可能如下:

POST /submit HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"Alice
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="profile_picture"; filename="alice.jpg"
Content-Type: image/jpeg[raw image data here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

在上述示例中:

  • boundary 参数是 ----WebKitFormBoundary7MA4YWxkTrZu0gW
  • 消息主体包含两个部分,一个是 username 字段,一个是 profile_picture 字段。
  • 每个部分由边界、一组头部信息、空行以及数据组成。
  • 消息主体的末尾存在一个 结束边界,它是开始边界与 两个连字符(--) 的组合。
原因

在开启 enable_post_data_reading 配置项时,$_POST$_FILESphp://input 将共同发挥作用。但在 Content-Typemulltipart/form-data 时,php://input 将无法获取到任何数据,PHP 将客户端发送的数据 解析存储至 $_FILES$_POST 中。

若将 enable_post_data_reading 配置项关闭,则 $_POST$_FILES 将无法获取到客户端传递的任何 POST 数据。在 Content-Typemulltipart/form-data 时,php://input 将获取到 POST 传递的原始数据。

不必要的 POST

php://input 的独立性

在 PHP 中,php://input 是一个只读流,它允许你访问原始的 HTTP 请求体。这个特性是独立于 HTTP 请求的方法的,意味着它不仅可以在 POST 请求中使用,也可以在 GET 或其他 HTTP 方法的请求中使用。

通常,我们将 php://input 与 POST 请求关联起来,因为 POST 请求常用于提交表单数据或上传文件,这些数据通常包含在请求体中。然而,php://input 的使用并不限于 POST 请求。无论是 GET、PUT、DELETE,还是其他 HTTP 方法,只要请求包含了请求体,php://input 都可以用来访问这些数据。

GET 请求也可以携带请求体

值得注意的是,GET 请求通常不包含请求体,因为 GET 方法主要用于从服务器检索数据,其数据通常通过 URL 的查询字符串传递。然而,技术上讲,HTTP 规范并没有禁止 GET 请求携带请求体,虽然这不是常见的做法。如果一个 GET 请求异常地包含了请求体,那么 php://input 仍然可以用来访问这些数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304337.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——fork复制进程

1)shell: 在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c;是指“为使用者提供操作界面”的软件&#xff08;command interpreter&#xff0c;命令解析器&#xff09;。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…

SpringBoot中的Redis的简单使用

在Spring Boot项目中使用Redis作为缓存、会话存储或分布式锁等组件&#xff0c;可以简化开发流程并充分利用Redis的高性能特性。以下是使用Spring Boot整合Redis的详细步骤&#xff1a; 1. 环境准备 确保开发环境中已安装&#xff1a; Java&#xff1a;用于编写和运行Spring…

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据&#xff0c;说明网关已生效&#xff0c;其原理流程图如下&#xff1a; 二、网关过滤器 作用&#xff1a;处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类&#xff1a; a. 某个路由的过滤器 …

LeetCode Meditations:合并 K 排序列表

描述 合并K分类列表 状态&#xff1a; 您有一系列 k 链接-列表 lists &#xff0c;每个链接-列表按升序排序。 合并所有链接-列表为一个排序的链接-列出并返回。 例如&#xff1a; Input: lists [[1, 4, 5], [1, 3, 4], [2, 6]] Output: [1, 1, 2, 3, 4, 4, 5, 6] Explanatio…

地理信息系统(ArcGIS)在水文水资源、水环境中的应用

刘老师&#xff08;副教授&#xff09;&#xff1a;来自北京重点高校资深专家&#xff0c;长期从事水资源与水环境、流域污染控制与管理、非点源模拟与控制、环境信息系统开发、环境遥感与GIS应用等领域的研究&#xff0c;发表多篇Sci论文、具有资深的技术底蕴和专业背景。 1、…

MapTracker:Tracking with Strided Memory Fusion for Consistent Vector HD Mapping

参考代码&#xff1a;MapTracker 动机与出发点 为了提升帧间检测的稳定性通常会添加时许信息&#xff0c;这个可以BEV特征处做时序融合&#xff0c;也可以是用当前帧query去cross-attn历史帧信息&#xff0c;则更多的时候是将之前帧信息与当前做融合或者cross-attn实现信息传…

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…

SIC知识--(1):来龙去脉

一、碳化硅的起源 1891年&#xff0c;当时爱德华古德里奇艾奇逊在尝试制造人造金刚石的过程中意外发现了这一材料。艾奇逊将黏土&#xff08;铝硅酸盐&#xff09;与粉状焦炭&#xff08;碳&#xff09;混合后在电炉中加热&#xff0c;预期得到金刚石&#xff0c;却意外获得了一…

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

Mac安装配置ElasticSearch和Kibana 8.13.2

系统环境&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) 一、准备 从Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic上下载ElasticSearch和Kibana 笔者下载的是 elasticsearch-8.13.2-darwin-aarch64.tar.gz kibana-8.13.2-darwin-aarch64.tar.gz 并放置到个人…

关于ASP.NET Core WebSocket实现集群的思考

前言 提到WebSocket相信大家都听说过&#xff0c;它的初衷是为了解决客户端浏览器与服务端进行双向通信&#xff0c;是在单个TCP连接上进行全双工通讯的协议。在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询&#xff0c;来实现服务端的变更响应到客户端&…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

机器学习实训 Day1

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

专为苹果系统设计的精美可视化图表 | 开源日报 No.219

danielgindi/Charts Stars: 27.3k License: Apache-2.0 Charts 是为 iOS/tvOS/OSX 提供美观图表的开源项目&#xff0c;是跨平台 MPAndroidChart 在苹果设备上的实现。该项目提供了以下主要功能和优势&#xff1a; 支持 iOS、tvOS 和 macOS 平台使用 Swift 编写&#xff0c;可…

Harmony鸿蒙南向驱动开发-PWM

PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff0c;是一种对模拟信号电平进行数字编码并将其转换为脉冲的技术&#xff0c;广泛应用在从测量、通信到功率控制与变换的许多领域中。通常情况下&#xff0c;在使用马达控制、背光亮度调节时会用到PWM模…

数据降维方法-主成分分析(PCA)

目录 一、前言 二、向量的表示及基变换 三、基变换 四、协方差矩阵 五、协方差 六、优化目标 一、前言 主成分分析(Principal Component Analysis) 用途&#xff1a;降维中的常用手段 目标&#xff1a;提取最有价值的信息&#xff08;基于方差&#xff09; 问题&#x…

Acwing.4009 收集卡牌(期望dp)

题目 小林在玩一个抽卡游戏&#xff0c;其中有 n种不同的卡牌&#xff0c;编号为 1到 n。 每一次抽卡&#xff0c;她获得第 i种卡牌的概率为 pi。 如果这张卡牌之前已经获得过了&#xff0c;就会转化为一枚硬币。 可以用 k枚硬币交换一张没有获得过的卡。 小林会一直抽卡&…

最祥解决python 将Dataframe格式数据上传数据库所碰到的问题

碰到的问题 上传Datafrane格式的数据到数据库 会碰见很多错误 举几个很普遍遇到的问题(主要以SqlServer举例) 这里解释下 将截断字符串或二进制数据 这个是字符长度超过数据库设置的长度 然后还有字符转int失败 或者字符串转换日期/或时间失败 这个是碰到的需要解决的最多的问…

网站HTTP升级成为HTTPS的方法

将网站从HTTP免费升级为HTTPS&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; - 为了免费升级&#xff0c;您可以选择使用JoySSL这样的公益项目。JoySSL提供免费、自动化的SSL/TLS证书颁发服务&#xff0c;适用于各…

三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

在OpenCV中可以通过ImRead方法读取照片&#xff0c;通过ImShow方法显示照片&#xff1b;但是无法在PictureBox控件中显示 PictureBox控件只能展示Bitmap和Image数据类型图片 为此查阅了网上很多篇博文&#xff0c;将三种数据类型之间的转换进行了归纳整理&#xff0c;感谢网上…