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

这篇具有很好参考价值的文章主要介绍了PHP 伪协议:使用 php://input 访问原始 POST 数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考

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

环境

项目 描述
PHP 5.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://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

更灵活的数据处理

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,你将得到如下类似界面。

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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

$_POST
<?php


# 超全局变量 $_POST 保持着一个关联数组
var_dump($_POST);

# 输出一个具有换行功能的 HTML 标签
echo '</br>';

# 获取名为 X 的 POST 参数的值
var_dump($_POST['X']);

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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

打开 HackBar 插件

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

通过 HackBar 插件发起 POST 请求

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

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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

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

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

基操

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

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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 数据后得到的关联数组。

php://input,安全,后端,php,原始 POST 数据,PHP 伪协议,PHP 配置,HTTP 请求,HackBar

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 仍然可以用来访问这些数据。文章来源地址https://www.toymoban.com/news/detail-771955.html

到了这里,关于PHP 伪协议:使用 php://input 访问原始 POST 数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络安全篇】php伪协议-漏洞及其原理

    🏆今日学习目标: 🍀学习php伪协议 ✅创作者:贤鱼 ⏰预计时间:35分钟 🎉个人主页:贤鱼的个人主页 🔥专栏系列:网络安全 🍁贤鱼的个人社区,欢迎你的加入 贤鱼摆烂团 🍁如果有需要可以查看下面文章 25分钟了解php?php基础 举个例子 include(文件名) ; 作用是如果文件

    2024年02月03日
    浏览(37)
  • php获取未解码之前的原始接口请求参数

    目前的几个项目,业务方基本都使用POST方式请求接口,本机磁盘会保留一份请求的原始参数用于请求分析和问题排查使用,一般有问题,也会基于seqid(请求唯一id)捞到日志,copy参数模拟请求看是否复现,但一直有个比较蛋疼的问题,PHP的 $_POST , $_GET , $_REQUEST 这些获取参数

    2024年02月03日
    浏览(35)
  • [CTF/网络安全] 攻防世界 fileinclude 解题详析(php伪协议)

    由于index.php在/var/www/html目录下,而flag.php与index.php同为php文件,故猜想flag.php也在该目录下。 查看页面源代码获取更多信息: 源代码中看到 @include($lan.\\\".php\\\"); ,即此处存在文件包含。 又因为 $lan = $_COOKIE[\\\'language\\\']; 因此解题思路为:利用php伪协议,构造language参数,来读取该目

    2024年02月07日
    浏览(35)
  • 6.php开发-个人博客项目&Tp框架&路由访问&安全写法&历史漏洞

    目录 知识点 php框架——TP URL访问 Index.php-放在控制器目录下 ​编辑 Test.php--要继承一下 带参数的—————— 加入数据库代码 --不过滤 --自己写过滤 --手册(官方)的过滤 用TP框架找漏洞: 如何判断网站是thinkphp? 黑盒: 白盒: php总结 ​ 1-基于TP框架入门安装搭建使用

    2024年01月25日
    浏览(44)
  • 第24天:安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制

    如果被抓包抓到数据包,并修改 Content-Type内容 则也可以绕过筛查 正常进行上传和下载 无过滤机制 黑名单过滤机制 使用 explode 函数通过点号分割文件名,获取文件后缀 使用 end 函数获取数组中的最后一个元素,即文件后缀 检查文件后缀是否在黑名单中 如果文件后缀在黑名

    2024年04月29日
    浏览(42)
  • php实战案例记录(16)php://input输入流

    php://input 是PHP中的一个特殊的输入流,它允许访问请求的原始数据。它主要用于处理非表单的POST请求,例如当请求的内容类型为 application/json 或 application/xml 时。使用 php://input 可以获取到POST请求中的原始数据,无论数据是什么格式。使用它来读取和解析JSON、XML或其他格式的

    2024年02月07日
    浏览(26)
  • 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞

    1.TP框架-开发-配置架构路由MVC模型 参考:https://www.kancloud.cn/manual/thinkphp5_1 配置架构-导入使用 路由访问-URL访问 数据库操作-应用对象 文件上传操作-应用对象 前端页面渲染-MVC模型 1.TP框架-安全-不安全写法版本过滤绕过 1.内置代码写法 不合要求的代码写法-ThinkPHP5-自写 2.框架

    2024年04月25日
    浏览(44)
  • web安全php基础_php数据类型

    PHP 支持以下几种数据类型: String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型) Array(数组) Object(对象) NULL(空值) Resource(资源类型) PHP 字符串 一个字符串是一串字符的序列,就像 “Hello world!”。 可以将任何文本放在单引号和双引号中: 执行效果如下

    2024年02月12日
    浏览(41)
  • php://input文件包含

    通过本实验,了解php封装伪协议,掌握php://input文件包含的用法 操作机:kali 靶机:Windows 实验地址:http://靶机ip/exp/include2/input/input2/ 工具:burpsuite 用户名:college 密码:360College php内置又很多内置URL风格的封装为协议,利用这些伪协议可以命令执行等操作。 登录“data和fil

    2024年02月13日
    浏览(30)
  • 小迪安全 第14天:php开发-个人博客项目&输入输出类&留言板&访问IP&UA头来源

    1.PHP-全局变量$_SERVER 2.MYSQL-插入语法INSERT 3.输入输出-XSS反射存储 4.安全问题-XSS跨站CSRF等 导入sql文件:navicat导入sql数据库文件的简单操作步骤_sql文件怎么导入navicat-CSDN博客①搜索框: ② php代码: ③结果  ④总结 在输入输出过程中有哪些安全问题:1.sql注入 2. XSS (在搜索框

    2024年04月26日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包