我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP伪协议filter详解,php://filter协议过滤器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP伪协议filter详解,php://filter协议过滤器

「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》

在这里插入图片描述

php://filter


php:// 用来访问输入和输出流(I/O streams)。

输入/输出流也就是「数据流」,数据流可以是某个文件(xx.php)或某个url(http://www.baidu.com)。

php://filter 可以在访问数据流之前进行「过滤」,并指定过滤方式。

php://filter 有4个可用参数:

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

提示:read/write参数不是必须的,可以直接使用过滤器,比如 php://filter/convert.base64-encode/resource=hello.php

直接「读取」数据源的内容,resource 参数必须位于 php://filter 的末尾,并指定需要过滤筛选的数据流。

1)读取「url形式」的数据流。

# 指定源文件,实际上没有应用过滤,会直接输出 http://www.baidu.com网页的内容# 等同于readfile('http://www.baidu.com');readfile('php://filter/resource=http://www.baidu.com');

因为没指定过滤条件弹了几条告警,不影响执行结果,不用管。

在这里插入图片描述

2)读取「文件形式」的数据流。

# 指定源文件,实际上没有应用过滤,会直接输出 hello.php文件的内容# 等同于 include('hello.php');include('php://filter/resource=hello.php');

同样因为没指定过滤条件弹了几条告警,不影响执行结果,不用管。

在这里插入图片描述

读取数据源之前,添加「过滤条件」

1)以「大写字母」读取 http://www.baidu.com页面的全部内容

readfile("php://filter/read=string.toupper/resource=http://www.baidu.com");

在这里插入图片描述

2)以「小写字母」读取 hello.php文件的全部内容

include("php://filter/read=string.tolower/resource=hello.php");

在这里插入图片描述

  1. hello.php文件的内容「base64加密」后读取出来。
    include()包含的文件,默认会执行文件中的代码,但加密后的内容不会被执行,而是直接输出在页面中,复制后解密就能拿到被包含文件的内容。
include("php://filter/read=convert.base64-encode/resource=hello.php");

在这里插入图片描述

同时使用「多个过滤条件」时,使用管道符 | 分隔。

1)base64加密并且转换为大写

<?phpinclude('php://filter/read=convert.base64-encode|string.toupper/resource=hello.php');

按照「从左到右」的顺序过滤,过滤条件的顺序可能会影响过滤的结果,比如:先转换大写再过滤的话,输出的结果就会变成小写的base64编码。

在这里插入图片描述

write 参数,过滤指定字符,并将过滤后的结果「输出」到指定文件中。

1)过滤字符,并输出到 result.txt文件中。

file_put_contents('php://filter/write=string.tolower/resource=result.txt','hello text');

在这里插入图片描述

1、string.rot13

string.rot13 ,PHP4.3.0及以后版本,对数据流的内容进行「rot13编码」,等于用str_rot13() 函数编码。

ROT13(otate by 13 places)也叫回转13位,是一种替换式密码。

ROT13会把每一个字母替换成13位之后的字母,也就是把a换成n,b换成o,以此类推;如果超过了26个字母的范围,就会从开头重新开始。

ROT13转换对照表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

常用方式:rot13编码读取文件内容后,复制页面输出的编码后的内容,手动用str_rot13()函数解码。

# rot13编码后读取 hello.php文件的内容include('php://filter/read=string.rot13/resource=hello.php');# 手动复制编码后的结果,输出rot13解码后的内容。print str_rot13(");

在这里插入图片描述

2、string.toupper

string.toupper,PHP5.0.0及以后版本,将数据流转换成「大写」,类似于 strupper() 函数。

需要注意的是,string.tuupper不是直接将文件内容变成大写,而是先执行文件内容,再将执行后的结果转换成大写。

# string.touper过滤器将 hello.php文件内容转换成大写include('php://filter/read=string.toupper/resource=hello.php');echo "\n";# 手动复制 hello.php文件内容,并使用strtoupper()转换成大写echo strtoupper(");

在这里插入图片描述

3、string.tolower

string.tolower,PHP5.0.0及以后版本,将数据流转换成「小写」,类似 strtolower()函数。

和 string.toupper,也是先执行文件的内容,再将执行后的结果转换成小写。

4、convert.base64-encode

1)convert.base64-encode,对数据流的内容进行「base64编码」,相当于 base64_encode()函数。

hello.php文件

echo 'hello.php文件的内容:hello test';

filter.php文件

include('php://filter/read=convert.base64-encode/resource=hello.php');

对 hello.php文件内容进行base64编码

在这里插入图片描述

2)编码后的内容可以使用 base64_decode()函数解码

print base64_decode('PD9waHANCmVjaG8gJ2hlbGxvLnBocOaWh+S7tueahOWGheWuue+8mmhlbGxvIHRlc3QnOw0KDQoNCg0KDQo=');

在这里插入图片描述

5、convert.iconv.*

convert.iconv.*,将数据流的内容按照「指定字符编码」来转换,使用格式有两种:

格式一:.分隔

convert.iconv.<input-encoding>.<output-encoding> 

格式二:/分隔

convert.iconv.<input-encoding>/<output-encoding>

比如,convert.iconv.utf-8*.utf-16* 的意思就是把文件的字符编码从 utf-8* 转换为 utf-16*

支持的字符编码有:

UCS-4*UCS-4BEUCS-4LE*UCS-2UCS-2BEUCS-2LEUTF-32*UTF-32BE*UTF-32LE*UTF-16*UTF-16BE*UTF-16LE*UTF-7UTF7-IMAPUTF-8*ASCII*EUC-JP*SJIS*eucJP-win*SJIS-win*ISO-2022-JPISO-2022-JP-MSCP932CP51932SJIS-mac (alias: MacJapanese)SJIS-Mobile#DOCOMO (alias: SJIS-DOCOMO)SJIS-Mobile#KDDI (alias: SJIS-KDDI)SJIS-Mobile#SOFTBANK (alias: SJIS-SOFTBANK)UTF-8-Mobile#DOCOMO (alias: UTF-8-DOCOMO)UTF-8-Mobile#KDDI-AUTF-8-Mobile#KDDI-B (alias: UTF-8-KDDI)UTF-8-Mobile#SOFTBANK (alias: UTF-8-SOFTBANK)ISO-2022-JP-MOBILE#KDDI (alias: ISO-2022-JP-KDDI)JISJIS-msCP50220CP50220rawCP50221CP50222ISO-8859-1*ISO-8859-2*ISO-8859-3*ISO-8859-4*ISO-8859-5*ISO-8859-6*ISO-8859-7*ISO-8859-8*ISO-8859-9*ISO-8859-10*ISO-8859-13*ISO-8859-14*ISO-8859-15*ISO-8859-16*byte2bebyte2lebyte4bebyte4leBASE64HTML-ENTITIES (alias: HTML)7bit8bitEUC-CN*CP936GB18030HZEUC-TW*CP950BIG-5*EUC-KR*UHC (alias: CP949)ISO-2022-KRWindows-1251 (alias: CP1251)Windows-1252 (alias: CP1252)CP866 (alias: IBM866)KOI8-R*KOI8-U*ArmSCII-8 (alias: ArmSCII8)

粉丝福利

评论区留言即可参与抽奖,下图9本书中任选一本。

在这里插入图片描述

618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华
社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多 个 IT
开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!

来源地址:https://blog.csdn.net/wangyuxiang946/article/details/131149171

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP伪协议filter详解,php://filter协议过滤器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP中的过滤器(Filter)是如何工作的?(请解释PHP中过滤器的使用场景和工作原理。)

PHP中的过滤器是一种验证、清理和转换数据的强大工具。它们通过过滤器链逐个应用过滤器来工作,每个过滤器执行特定操作。过滤器在各种场景下使用,包括表单验证、数据清理、安全过滤和数据转换。它们易于使用、高效且可靠,并提供了一组预定义的规则和函数,简化了数据处理过程。最佳实践包括选择适当的过滤器、使用过滤器链、检查错误、自定义过滤器和避免过度过滤。
PHP中的过滤器(Filter)是如何工作的?(请解释PHP中过滤器的使用场景和工作原理。)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录