php的伪协议
注意:用于描述一个封装协议的URL语法仅支持 scheme://… 的语法。scheme:/ 和 scheme: 语法不支持
协议名 |
解释 |
file:// |
访问本地文件系统 |
http:// |
访问http(s)网址 |
ftp:// |
访问FTP(s)URLS |
php:// |
访问各个输入/输出流(I/O Streams) |
zlib:// |
压缩流 |
data:// |
数据流 |
glob:// |
查找匹配的文件路径moshi |
phar:// |
PHP归档 |
ssh2:// |
Secure Shell 2 |
rar:// |
RAR |
ogg:// |
音频流 |
expect:// |
处理交互式的流 |
file://
文件系统是php使用的默认封装协议,展现了本地文件系统。当指定了一个相对路径(不以/、\、\\或Windows盘符开头的路径)提供的路径将基于当前的工作目录。
在很多情况下是脚本所在的目录,除非被修改了。使用CLI的时候,目录默认是脚本被调用时所在的目录。
在某些函数里,eg:fopen() 和 file_get_contents(),include_path会可选择地搜索,也可作为相对的路径。
file协议不受 allow_url_fopen 和 allow_url_include 影响
事例:
只要知道绝对文件的绝对路径就可以读取任意文件(在没有限制的条件下)
http://192.168.1.105/archives.php?archive=file://C:\Users\ROC\Desktop\1.txt
http:// 或 https://
允许通过HTTP1.0 的GET方法,以只读访问文件或资源。HTTP请求会附带一个Host:头,用于兼容基于域名的虚拟主机。
如果在你的 php.ini 文件中或字节流上下文(context)配置了 uesr_agent 字符串,它也会被包含在请求之中。
数据流允许读取资源的body,而headers则存储在了 $http_response_header 变量里
如果需要知道文档资源来源那个URL(经过所有重定向的处理后),需要处理数据流返回的系列相应报头(reponse headers)
受 allow_url_fopen 和 allow_url_include (默认是关闭的) 的限制
http://192.168.1.105/archives.php?archive=http://www.baidu.com/
ftp://
允许通过FTP读取存在的文件,以及创建新文件。如果服务器不支持被动(passive)模式的FTP,连接会失败
打开文件后即可以读也可以写,但是不能同时进行。当远程文件已经存在于FTP服务器上,如果尝试打开并写入文件的时候,
未指定上下文(context)的overwrite选项来打开、写入。另外可使用FTP扩展来代替。
如果设置 php.ini 中的from指令,这个值会作为匿名 ftp的密码
受 allow_url_fopen 和 allow_url_include (默认是关闭的) 的限制
Note:FTPS仅在openssl扩展开启时有效。
如果服务器不支持SSL,这个连接会降级(falls back)到普通的ftp加密
自PHP5.0.0起文件可以通过ftp://URL 封装器来追加,在之前的版本,尝试通过 ftp:// 追加一个文件将会导致错误
php://
访问各个输入/输出流(I/O stream)
PHP提供了一些杂项输入/输出(IO)流,允许访问PHP的输入输入流,
标准输入输出和错误描述符,内存中,磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
php://stdin,php://stdout和php://stderr
允许直接访问PHP进程相应的输入或者输出流。数据流引用了复制的文件描述符,
所以如果打开 php://stdin并在之后关了它,仅是关了复制品,真正被引用的 STDIN 并不受影响。
注意:PHP在这方面的行为有很多BUG直到 PHP5.2.1
推荐使用常量 STDIN、STDOUT和STDERR来代替手工代打开这些封装器。
php://stdin 只读
php://stdout和php://stderr 只写
不受 allow_url_fopen 影响;受 allow_url_include 的影响
php://input
可以访问请求的原始数据的只读流,将POST请求中的数据作为PHP代码执行。
不受 allow_url_fopen 的影响;受 allow_url_include 的影响
http://127.0.0.1/cmd.php?file=php://input
[POST DATA] <?php phpinfo()?>
php://output
一个只写的数据流,允许以print和echo一样的方式写入到输出缓冲区
不受 allow_url_fopen 和 allow_url_include 的影响
php://fd
允许直接访问指定的文件描述符
说明:文件描述符是由无符号整数表示的句柄,进程使用它来标识代开的文件。
文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等。)的文件对象相关联,
这些信息被称作文件的上下文。
文件描述符与文件指针的区别
文件描述符 |
文件指针 |
在Linux系统中打开文件就会获得文件描述符,是个很小的非负整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。 |
C语言中文件指针作为I/O句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此某种意义上说文件指针就是句柄的句柄。(在Windows系统上,文件描述符被称作文件句柄) |
``` |
|
php://memory和php://temp |
|
类似文件包装器的数据流,允许读写临时数据。两者唯一的区别是 php://memory 总是把数据存储在内存中。php://tmp会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中,临时文件位置由 sys_get_temp_dir()确定 |
|
php://temp的内存限制可通过添加 /maxmemory:NN 来控制。NN是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。 |
|
不受allow_url_fopen 影响;受 allow_url_include 的影响 |
|
php://filter
类似 readfile()、file()、和 file_get_contents() 在数据流内容读取之前没有机会应用其它过滤器。
php://filter的参数
名字|解释|作用
-|-|-
resource|要过滤得数据流|必须,指定要筛选过滤得数据流
read|读链的筛选列表|可选,可以设定一个或多个过滤器名称,以 / 分割
write|写链的筛选列表|可选,可以设定一个或多个过滤器名称,以 / 分割
;|两个链的筛选列表|任何没有以 read= 或 write= 作为前缀的筛选器列表会视情况应用读或写
**不受 allow_url_fopen 和 allow_url_include 的影响**
**总结:php://协议,不需要开启 allow_url_fopen ,仅 php://input、php://stdin、php://memory和php://temp需要开启 allow_url_include**
# zlib://
zlib://
bzip2://
zip://
不受 allow_url_fopen 和 allow_url_include 的影响
zip://、bzip2://、zlib://均属于压缩流,可以访问压缩文件中的字文件,更重要的是不需要指定后缀名。
zip:// 不能使用相对路径
zip://压缩文件绝对路径#压缩文件内的子文件名
绝对路径/相对路径均可
bzip2://
compress.bzip2://file.bz2
zlib://
compress.zlib://file.gz
# data://
**受 allow_url_fopen 和 allow_url_include 的影响**
data://text/plain,asdf
http://192.168.1.105/archives.php?archive=data://text/plain,<?php phpinfo();die();?>
![](/PHP伪协议/20190922034054058.png)
data://text/plain;base64, PD9waHAgcGhwaW5mbygpO2RpZSgpPz4=
http://192.168.1.105/archives.php?archive=data://text/plain;base64,PD9waHAgcGhwaW5mbygpO2RpZSgpPz4=
![](/PHP伪协议/20190922034112054.png)
# glob://
自php5.3.0开始有效
不受 allow_url_fopen 和 allow_url_include 的影响
glob://
![](/PHP伪协议/20190922034135910.png)
# phar://
phar:// 自 PHP 5.3.0 启有效。
phar的本质是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分会以序列化的形式存储用户自定义的 meta-data
如果构建phar文件,需要将 php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件
# ssh2://
该封装器默认没有计划,如果使用需要安装,PECL的SSH2扩展
# rar://
rar://压缩包路+名字 #或者* 压缩包内的文件
# ogg://
默认未激活
# expect://
封装协议打开数据流PTY,通过提供对进程stdio、stdout和stderr的访问
默认未开启,需要安装PECL上的Expect扩展