8.3 php://输入输出流
提到流,大家会想到水流或者数据流,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论