返回介绍

8.3 php://输入输出流

发布于 2024-10-11 22:07:46 字数 1760 浏览 0 评论 0 收藏 0

提到流,大家会想到水流或者数据流,PHP 提供了 php://的协议允许访问 PHP 的输入输出流、标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。主要提供如下访问方式来使用这些封装器:

php : //stdin

php : //stdout

php : //stderr

php : //input

php : //output

php : //fd

php : //memory

php : //temp

php : //filter

使用最多的是 php://input、php://output 以及 php://filter,其中 php://input 是可以访问请求的原始数据的只读流。即可以直接读取到 POST 上没有经过解析的原始数据,但是 php://input 不能在获取“multipart/form-data”方式提交的数据。我们做一个测试,测试代码如下:

<?php

echo file_get_contents ( "php : //input" );

当我们用 POST 提交 a=111111 时,a=111111 被直接打印出来,如图 8-4 所示。

图 8-4

而 php://output 是一个只写的数据流,跟 php://input 相反,php://input 是读取 POST 提交上来的数据,而 php://output 则是将流数据输出。

php://filter 是一个文件操作的协议,可以对磁盘中的文件进行读写操作,效果类似于 readfile()、file() 和 file_get_contents(),它有多个参数可以进行相应的操作,说明如表 8-1 所示。

表 8-1

我们来测试使用 php://filter 写文件,测试代码如下:

<?php

file_put_contents ( "php : //filter/write=string.rot13/resource=example.txt" , "Hello World" );? >

当我们执行代码的时候,会像脚本同目录下写入“example.txt”文件,内容为 rot13 编码过的“Hello World”,而 php://filter 还可以用来读文件,如果有远程文件保护漏洞,类似如下的代码:

<?php

include ( $_GET['f'] );? >

正常情况下如果我们直接传入一个文件名,则是会被 include 函数包含并执行,如果我们想读取 Web 目录下的 PHP 文件,则可以通过请求:

/1.php?f=php : //filter/convert.base64-encode/resource=1.php

来将文件进行 Base64 编码后输出,输入结果如图 8-5 所示。

图 8-5

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文