php://filter 是什么?
我的理解是,它是一个中间流处理器。就是说,我们 发送/接收 的数据先经过它的处理再发送给 内部/外部 。根据它的名字也不难判断,他本意是用来进行数据的过滤。
它一般有以下可用的参数:
参数 | 描述 | 备注 |
---|---|---|
resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 |
read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
没有以read=
或 write=
作为前缀的筛选器会视情况应用于写或读。
我一般遇到的多是需要读的也就是read=,运用它的前提是要有 类似 include、require、include_once、require_once、file_get_contents、readfile 这些,就是会读取文件内容的。
而写的话,一般就类似 file_put_contents 类似的函数会进行写操作的。
常用过滤器
其实过滤器才是我们需要特别关注的东西,就像一次题目过滤了 base 和 string ,导致我们一系列过滤器无法使用,但经查阅资料是可替换的。
convert.base64
这类过滤器是我以前最常用的过滤器,convert.* 是属于转换过滤器(Conversion Filters),
convert.base64-encode ,它将我们读到的数据进行base64编码后返回,相当于执行了一个base64_encode()
。那么不难推测 convert.base64-decode 相当与执行一个 base64_decode()
convert.iconv.*
这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的,也就是默认支持。使用convert.iconv.*过滤器等同于用iconv()
函数处理所有的流数据。
它有2中用法如:
1 | convert.iconv.<input-encoding>.<output-encoding> |
将读取到的内容从 input-encoding
转换为 output-encoding
返回。
iconv支持的编码
1 | UCS-4* |
我们一般使用UCS-*
这类编码作为output-encoding
就可以读到源码了。
我们一般的页面使用的是utf-8
编码(当然也不绝对)所以我们 将input-encoding
用 utf
-8
即可。
string.rot13
使用此过滤器等同于用 str_rot13()函数处理所有的流数据。
string.rot13对字符串执行 ROT13 转换,ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。因为总共是26个字母所以,编码和解码都使用相同的函数,传递 一个编码过的字符串作为参数,将得到原始字符串。
string.strip_tags
(PHP 4, PHP 5, PHP 7)(自PHP 7.3.0起已弃用此功能。)
使用此过滤器等同于用 strip_tags()函数处理所有的流数据。
string.strip_tags从字符串中去除 HTML 和 PHP 标记,尝试返回给定的字符串 去除空字符、HTML 和 PHP 标记后的结果。它使用与函数 fgetss() 一样的机制去除标记。
这里需要特别注意:
HTML 注释和 PHP 标签也会被去除。
以上就是我对 php://filter
读取源码的一些理解和常用的姿势。 当然 php://filter
也可用来绕过 死亡exit。
【参考链接】