php伪协议详解

news2024/9/27 17:24:50

php:// — 访问各个输入/输出流(I/O streams)
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器

文章目录

  • 一、输入和输出流
    • 1. php://stdin
    • 2. php://stdout
    • 3. php://stderr
  • 二、php://input
  • 三、php://output
  • 四、php://fd
  • 五、php://memory 和 php://temp
  • 六、php://filter
    • 1. 读文件
    • 2. 写文件
    • 3. 远程文件
    • 4. 过滤数据
      • 字符串过滤器
      • 转换过滤器
      • 压缩过滤器
      • 加密过滤器
  • 参考

一、输入和输出流

php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程相应的输入或者输出流
php://stdin 是只读的, php://stdout 和 php://stderr 是只写的
该协议使用在php的命令行模式

只读

  • php://stdin

只写

  • php://stdout
  • php://stderr

这里的输入输出流和linux很像,如果你熟悉linux的标准文件描述符那么你一定能理解这个

1. php://stdin

<?php
$stdin = fopen("php://stdin", 'r');		# 打开输入流
$line = fgets($stdin);		# 获取一行数据
echo "你输入了:".$line;		# 输出
fclose($stdin);		# 关闭

在这里插入图片描述
数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响
这里需要使用 fopen 打开相应流,php提供了对应的STDIN, STDOUT,STDERR 常量来快速引用

  • STDIN: php://stdin
  • STDOUT: php://stdout
  • STDERR: php://stderr

比如上面的代码可以简化为

$line = fgets(STDIN);
echo "你输入了:".$line;

这里做测试时发现该流对windows的支持不好,windows下无法输入中文,linux倒是可以

2. php://stdout

向控制台输出数据

file_put_contents("php://stdout", "hello I is file_put_contents\n");
fwrite(STDOUT, "hello I is fwrite\n");

在这里插入图片描述

3. php://stderr

php://stdout一样的用法,不过它输出的是错误的输出流

file_put_contents("php://stderr", "hello I is file_put_contents\n");
fwrite(STDERR, "hello I is fwrite\n");

甚至输出都是一样的,不过他们代表的含义不同,可以使用linux做测试

fwrite(STDERR, "ERROR\n");
fwrite(STDOUT, "OUT\n");

在这里插入图片描述

二、php://input

该协议可以直接获取post请求体的所有数据,但是如果是文件上传就无法进行获取
如果是表单数据,比如 a=1
那么就会获取 a=1
如果是 xml数据,{"a": 1}, 那么同样获取{"a": 1}

三、php://output

该协议和echo,print等函数一样,输出数据

file_put_contents("php://output", "123456789");

在这里插入图片描述

四、php://fd

略… ,以后补充

五、php://memory 和 php://temp

这两个流都允许读写,php://memory 总是把数据储存在内存中,而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。 临时文件位置可以使用 sys_get_temp_dir() 查看

echo sys_get_temp_dir();	# 输出临时文件位置
echo "<br>";
$fp = fopen("php://temp", 'r+');

fputs($fp, "hello\n");      # 写入数据
rewind($fp);            # 指针回到文件开头
echo stream_get_contents($fp);  # 从指针位置输出

php://memory的使用方式和php://temp一样, php://temp可以指定写入多大数据时写入到临时文件中

// 限制内存为 5 MB。
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

php://memory 和 php://temp 是一次性的,比如:stream 流关闭后,就无法再次得到以前的内容了

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 啥也没有

六、php://filter

该协议可以对文件进行过滤
这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents()

名称描述
resource=<要过滤的数据流>这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符分隔。
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符分隔。
<;两个链的筛选列表>任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

1. 读文件

resource指定要操作的文件

echo file_get_contents("php://filter/resource=1.txt");

2. 写文件

echo file_put_contents("php://filter/resource=1.txt", "hello");

3. 远程文件

需要在php.ini中开启allow_url_fopen=On

读取远程文件内容

echo file_get_contents("php://filter/resource=https://www.baidu.com/robots.txt");
echo file_get_contents("php://filter/resource=data://text/plain,hello%20myname%20is%20wlb");

这里远程读取可以看看php支持的协议

4. 过滤数据

在对文件进行操作时,可以指定过滤器, read对读取的数据进行过滤,write针对写
stream_get_filters() 来列出 PHP 中已安装的过滤器

字符串过滤器

使用read指定读取的时候使用的过滤器,read=string.toupper ,对读取的数据进行大写处理

echo file_get_contents("php://filter/read=string.toupper/resource=data://text/plain,hello");

输出

HELLO

对于写入同样适用,但是需要使用write进行过滤

file_put_contents("php://filter/write=string.toupper/resource=1.txt", "hello");

如果不指定read获取write那么会根据情况自动识别

# 写
file_put_contents("php://filter/string.toupper/resource=1.txt", "hello");
# 读
file_get_contents("php://filter/string.toupper/resource=1.txt");

除了string.toupper 外,还有以下字符串过滤器,以及功能对应的函数

  • string.rot13 : str_rot13()
  • string.toupper : strtoupper()
  • string.tolower : strtolower()
  • string.strip_tags : strip_tags() :本特性已自 PHP 7.3.0 起废弃

转换过滤器

  • convert.base64-encode : base64加密
  • convert.base64-decode :base64解密
  • convert.quoted-printable-encode: quoted-printable编码
  • convert.quoted-printable-decode quoted-printable解码
  • convert.iconv.*; 字符编码转换

有人可能对quoted-printable编码不太熟悉,该编码会对特殊字符进行编码,正常的ascii码原样显示
在这里插入图片描述

可以自己运行尝试, 远程协议记得开启allow_url_fopen=On
base64编码解码

echo file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,hello");
echo file_get_contents("php://filter/convert.base64-decode/resource=data://text/plain,aGVsbG8=");

quoted-printable编码解码

file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,我勒了个去");
# =E6=88=91=E5=8B=92=E4=BA=86=E4=B8=AA=E5=8E=BB
echo file_get_contents("php://filter/convert.quoted-printable-decode/resource=data://text/plain,=E6=88=91=E5=8B=92=E4=BA=86=E4=B8=AA=E5=8E=BB");
# 我勒了个去

字符编码转换
参考函数 iconv()

echo file_get_contents("php://filter/convert.iconv.utf-16.utf-8/resource=data://text/plain,I_love_you");

压缩过滤器

在激活 zlib 的前提下可以使用 zlib.* 压缩过滤器
在激活 bz2 支持的前提下可以使用 bzip2.* 压缩过滤器。

  • zlib.deflate :gzip 压缩
  • zlib.inflate :gzip 解压
  • bzip2.compress :bz2 压缩
  • bzip2.decompress :bz2解压
file_get_contents("php://filter/zlib.deflate/resource=1.txt");
file_get_contents("php://filter/zlib.inflate/resource=1.txt");

大家应该都能举一反三了

加密过滤器

以后补充

参考

  • php伪协议
  • 过滤器

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++前缀和算法的应用:分割数组的最多方案数 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个下标从 0 开始且长度为 n 的整数数组 nums 。分割 数组 nums 的方案数定义为符合以下两个条件的 pivot 数目&#xff1a; 1 < pivot < n nums[0]…

区块链外包开发需要注意的问题

在进行区块链外包开发时&#xff0c;有一些关键问题需要特别注意&#xff0c;以确保项目的成功和质量。以下是一些需要考虑的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.明确的需求和目标&…

公众号视频怎么下载,3个方法教你如何操作!

公众号视频怎么下载&#xff0c;今天教你如何操作下载公众号视频&#xff0c;废话不多说&#xff0c;看教程 关于分享的教程我们分享一下三种方法 1&#xff1a;公众号视频查看源代码 2&#xff1a;获取公众号小助手下载公众号视频 3&#xff1a;QQ浏览器下载法 公众号视频…

C盘满了怎么清理文件?

电脑的C盘是我们电脑存储系统文件和应用程序的一个重要盘符&#xff0c;很多人经常会遇到C盘空间不足的问题&#xff1b;虽然我们可以通过卸载程序或者删除文件来释放空间&#xff0c;但是在这个过程中往往会误删掉一些重要的文件&#xff0c;造成部分程序可能无法正常使用。 因…

python 连接oracle数据库的过程步骤(亲测有效)--windows

目录 1. 安装 cx_Oracle 模块 2. 安装 oracle 客户端 3. 连接 oracle数据库 连接oracle数据库的过程中遇到很多问题&#xff0c;不过好在一一解决了&#xff0c;特地将解决问题的过程记录下来供友友们参考~ 1. 安装 cx_Oracle 模块 具体可参考 PyCharm 安装 cx_Oracle 失败…

急需一个免费又实用的配音软件~

做自媒体的朋友肯定需要用到大量的文案配音&#xff0c;又不想自己配&#xff0c;就只能在网上找AI配音的小程序、网站和软件&#xff0c;可是找了&#xff0c;又有很多效果不好&#xff0c;情绪单调。 不过没关系&#xff0c;今天我将为大家介绍一款超实用的配音网站&#xf…

【Unity程序技巧】2D音乐中心管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

MII,RMII,GMII,RGMII区别

一、MII,GMII为百兆网口 1.MII ①引脚接线图 ②引脚定义 2.GMII ①引脚接线图 ②引脚定义 二、GMII,RGMII为千兆网口 1.GMII ①GMII引脚接线图 ②GMII引脚定义 2.RGMII ①RGMII引脚接线图 ②RGMII引脚定义 三、PCB走线注意 ① RGMII 模式下&#xff0c;MAC 的 RXD0&a…

WireShark使用入门

背景 Wireshark&#xff0c;又被称为网络封包分析软件&#xff0c;是一种开源且功能十分强大的工具。该工具的主要功能是截取各种网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。它使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。 Wireshark支持W…

简单有效的方法压缩图片大小,尝试一键自动压缩!

如果图片过大&#xff0c;会占据我们过多的存储空间&#xff0c;可能会引起电脑的卡顿&#xff0c;传输的速度很慢&#xff0c;也很容易传输失败&#xff0c;这时候可以把图片压缩&#xff08;https://www.yasuotu.com/&#xff09;一下&#xff0c;那么怎么才能快速压缩图片大…

【Note】完全二叉树的类型定义

完全二叉树 完全二叉树&#xff1a;深度为k&#xff0c;结点数为n的二叉树&#xff0c;如果其结点1~n的位置序号分别与等高的满二叉树的结点1~n的位置序列一一对应&#xff0c;则为完全二叉树。 完全二叉树的特点&#xff1a; 叶子结点只可能出现在最后两层。度为1的结点个数…

关于c语言,你必须了解的运行流程

流程图 1.程序的翻译环境和执行环境 在ANSIC任何一种实现下,都存在两种环境,程序的翻译环境和执行环境 翻译环境:将源代码转换成机器指令 执行环境:用于执行代码 2.详解编译链接 简单的说一个代码从编写到看到控制台的结果分为编译链接两步即可,接下来我们将详细解释编译链接中…

6 STM32标准库函数 之 内部集成电路(I2C) 所有函数的介绍及使用

6 STM32标准库函数 之 内部集成电路&#xff08;I2C&#xff09;所有函数的介绍及使用 1. 图片有格式2 文字无格式六 库函数之内部集成电路&#xff08;I2C&#xff09;所有函数的介绍及使用前言一、图片预览&#xff0c;无格式&#xff08;CSDN&#xff09;二、 I2C库函数固件…

(链表) 25. K 个一组翻转链表 ——【Leetcode每日一题】

❓ 25. K 个一组翻转链表 难度&#xff1a;困难 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保…

Python-股票市场用于算法交易的人类反馈强化学习 (RLHF)

ChatGPT 的成功使人类反馈强化学习 (RLHF) 技术成为人们关注的焦点。RLHF 是一种机器学习方法,它结合了强化学习 (RL) 和人类反馈 (HF) 来改进学习过程。这篇文章将使您对 RLHF 有一个全面的了解。它描述了 RLHF 在算法交易(algo transactions)中的应用,并提供了可执行的 P…

TLSF内存管理算法原理详解

TLSF算法原理概述 TLSF算法的核心优势在于其通过位运算执行内存块匹配算法&#xff0c;并兼顾了内存管理的额外内存消耗&#xff0c;无论是从内存池申请内存块还是释放内存块回内存池其操作都是O(1)。TLSF组织了一张一二级索引表映射其所有管理内存块的闲忙状态&#xff0c;并通…

简单聊下Redis的主从复制和哨兵机制以及集群(面试题)

ChatGPT的简答&#xff1a; Redis的主从复制&#xff08;Master-Slave Replication&#xff09;是指将一个Redis服务器的数据复制到其他Redis服务器的过程&#xff0c;其中一个服务器作为主节点&#xff08;Master&#xff09;&#xff0c;而其他服务器作为从节点&#xff08;S…

基于SSM的居家养老系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

快速学习如何注册域名企业邮箱,只需5分钟

网站最重要的一个东西&#xff0c;就是你要有一个域名邮箱&#xff0c;显得你的邮箱更加专业&#xff0c;怎么样去申请一个域名邮箱&#xff0c;之前也出过一些内容给过大家&#xff0c;很多方法已经过时了&#xff0c;今天给大家更新一个最新版的&#xff0c;怎么样去申请一个…

【C++代码】安排行程,N皇后,解数独--代码随想录

题目&#xff1a;重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…