PHP伪协议是什么?
PHP 伪协议是一种特殊的协议,它允许在 PHP 中以一种类似 URL 的方式访问和操作不同类型的资源,而无需依赖传统的网络协议(如 HTTP、FTP 等)。伪协议在文件包含、代码执行等操作中非常有用,但如果使用不当,也会带来严重的安全风险。
分类
1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流
file://协议
读取本地计算机系统文件(本地文件传输协议)
URL中为什么跟三个斜杠
首先url的结构:
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
如果有host,前面需要加//,因此对于http或https等网络地址来说会写成:
https://blog.csdn.net/lishanleilixin/article/category/7191777
这样看上去很自然,如果是文件的话,文件没有host,所以中间的host部分就不要了,就变成了
file:///lishanleilixin/article/category/7191777
data://协议
需满足allow_url_fopen
,allow_url_include
同时开启才能使用
使用格式:
data://[<MIME-type>][;charset=<encoding>][;base64],<data>
- MIME-type:指定数据的类型,默认是
text/plain
- charset:指定数据的编码类型,如
utf-8
- base64:如果使用 Base64 编码,则加上该标识
- data:实际的数据内容
glob://
glob:// — 查找匹配的文件路径模式
// 循环 ext/spl/examples/ 目录里所有 *.php 文件
// 并打印文件名和文件尺寸
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
输出:
tree.php: 1.0K
findregex.php: 0.6K
findfile.php: 0.7K
dba_dump.php: 0.9K
nocvsdir.php: 1.1K
phar_from_dir.php: 1.0K
ini_groups.php: 0.9K
directorytree.php: 0.9K
dba_array.php: 1.1K
class_tree.php: 1.8K
zlib://协议
作用:
zlib://
是 PHP 中用于 透明地解压 .gz
文件 的流包装器(Stream Wrapper),它允许开发者直接读取或写入经过 zlib
压缩的数据,而无需手动解压文件
使用格式:
compress.zlib://file.gz
例子:
http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg
http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
简单通俗的说,这是一个中间件,在读入或写入数据的时候对数据进行处理后输出的一个过程。
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取
协议参数
名称 | 描述 |
---|---|
resource=<要过滤的数据流> | 这个参数是必须的。它指定了你要筛选过滤的数据流 |
read=<读链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符()分隔 |
write=<写链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符()分隔 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链 |
常用格式
php://filter/read=convert.base64-encode/resource=index.php
php://filter/resource=index.php
过滤器
字符串过滤器
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.*; 字符编码转换
解释一下convert.iconv*(~参考函数iconv()~)
例子:convert.iconv.utf-8.utf-16le
过滤器
convert.iconv
是php://filter
中用于字符编码转换的过滤器,其具体语法格式为convert.iconv.源编码-目标编码
。在这个例子中:
源编码
是utf-8
,表示原始文件内容的编码格式为 UTF-8 编码目标编码
是utf-16le
,utf-16le
代表小端序的 UTF-16 编码,即该过滤器会将读取到的 UTF-8 编码的文件内容转换为小端序的 UTF-16 编码
压缩过滤器
注意,这里的压缩过滤器指的并不是在数据流传入的时候对整个数据进行写入文件后压缩文件,也不代表可以压缩或者解压数据流。压缩过滤器不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分
zlib.deflate :gzip 压缩
zlib.inflate :gzip 解压
bzip2.compress :bz2 压缩
bzip2.decompress :bz2解压
加密过滤器
mcrypt.*
mdecrypt.*
使用 libmcrypt 提供了对称的加密和解密
php://input
是一个可以访问请求的原始数据的只读流
将post请求中的数据作为PHP代码执行
需要开启
allow_url_include
http://127.0.0.1/cmd.php?file=php://input
POST:<?php phpinfo()?>
持续更新~~~~