关于php支持的协议与封装协议总结(推荐)


Posted in PHP onNovember 17, 2017

前言

当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作。

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

Note: 用于描述一个封装协议的 URL 语法仅支持 scheme://... 的语法。 scheme:/ 和 scheme: 语法是不支持的。

php协议类型

  • file:// — 访问本地文件系统
  • http:// — 访问 HTTP(s) 网址
  • ftp:// — 访问 FTP(s) URLs
  • php:// — 访问各个输入/输出流(I/O streams)
  • zlib:// — 压缩流
  • data:// — 数据(RFC 2397)
  • glob:// — 查找匹配的文件路径模式
  • phar:// — PHP 归档
  • ssh2:// — Secure Shell 2
  • rar:// — RAR
  • ogg:// — 音频流
  • expect:// — 处理交互式的流

PHP.ini

  • allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
  • allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等

file://协议

file:// — 访问本地文件系统,不受allow_url_fopen与allow_url_include的影响

关于php支持的协议与封装协议总结(推荐)

使用方法

file:// [文件的绝对路径和文件名]

http://127.0.0.1/code/1.php?file=file:///E:\phpStudy\WWW\code\phpinfo.php

关于php支持的协议与封装协议总结(推荐)

php://协议

php:// — 访问各个输入/输出流(I/O streams)

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php://stdin, php://stdout 和 php://stderr

php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程相应的输入或者输出流。

php://stdin 是只读的, php://stdout 和 php://stderr 是只写的。

php://stdin

<?php
 while($line = fopen('php://stdin','r'))
 {//open our file pointer to read from stdin
 echo $line."\n";
 echo fgets($line);//读取
 }
?>

关于php支持的协议与封装协议总结(推荐)

php://stdout

<?php
 $fd = fopen('php://stdout', 'w');
 if ($fd) {
 echo $fd."\n";
 fwrite($fd, "test");
 fwrite($fd, "\n");
 fclose($fd);
 }
?>

关于php支持的协议与封装协议总结(推荐)

php://stderr

<?php
 $stderr = fopen( 'php://stderr', 'w' );
 echo $stderr."\n";
 fwrite($stderr, "uknow" );
 fclose($stderr);
?>

关于php支持的协议与封装协议总结(推荐)

php://filter

最常使用的一个伪协议,一般可以利用进行任意文件读取。

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

参数

名称 描述
resource= 这个参数是必须的。它指定了你要筛选过滤的数据流。
read= 该参数可选。可以设定一个或多个过滤器名称,以管道符分隔。
write= 该参数可选。可以设定一个或多个过滤器名称,以管道符分隔。
任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
<?php
	include($_GET['file'])
?>
http://127.0.0.1/code/1.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php

关于php支持的协议与封装协议总结(推荐)

关于php支持的协议与封装协议总结(推荐)

php://input

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

  • allow_url_fopen :off/on
  • allow_url_include:on

关于php支持的协议与封装协议总结(推荐)

zip://, bzip2://, zlib://协议

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

  • allow_url_fopen :off/on
  • allow_url_include:off/on

使用方法

zip://archive.zip#dir/file.txt

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

测试

先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

http://127.0.0.1/code/1.php?file=zip://E:\phpStudy\WWW\code/1.zip%231.txt

关于php支持的协议与封装协议总结(推荐)

data://协议

data://协议必须双在on才能正常使用;

  • allow_url_fopen :on
  • allow_url_include:on
http://127.0.0.1/code/1.php?file=data://text/plain,<?php phpinfo()?>
http://127.0.0.1/code/1.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

关于php支持的协议与封装协议总结(推荐)

关于php支持的协议与封装协议总结(推荐)

glob://协议

glob:// — 查找匹配的文件路径模式

<?php
$it = new DirectoryIterator($_GET['file']);
foreach($it as $f) {
 printf("%s", $f->getFilename());
	echo'</br>'; 
}
?>

关于php支持的协议与封装协议总结(推荐)

expect://协议

expect:// — 处理交互式的流

该封装协议默认未开启

为了使用 expect:// 封装器,你必须安装 » PECL 上的 » Expect 扩展。

用法

expect://command

附:HTTP协议是无状态的和Connection: keep-alive的区别

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系

HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)

从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Reference

  • PHP
  • php伪协议实现命令执行的七种姿势
PHP 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
php下封装较好的数字分页方法
Nov 23 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
php获取textarea的值并处理回车换行的方法
Oct 20 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
php事件驱动化设计详解
Nov 10 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
PHP filesize函数用法浅析
Feb 15 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 #PHP
PHP实现链式操作的三种方法详解
Nov 16 #PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 #PHP
PHP实现验证码校验功能
Nov 16 #PHP
学习thinkphp5.0验证类使用方法
Nov 16 #PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 #PHP
php表单处理操作
Nov 16 #PHP
You might like
我用php+mysql写的留言本
2006/10/09 PHP
php 表单验证实现代码
2009/03/10 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
简单实现js浮动框
2016/12/13 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
Python中内置的日志模块logging用法详解
2016/07/12 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
迎八一活动主题
2014/01/31 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle