关于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 相关文章推荐
又一个php 分页类实现代码
Dec 03 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
PHP类的封装与继承详解
Sep 29 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
PHP执行普通shell命令流程解析
Aug 24 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 图片上传类代码
2009/07/17 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
Python识别html主要文本框过程解析
2020/02/18 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
高三语文复习计划
2015/01/19 职场文书
拉贝日记观后感
2015/06/05 职场文书
高中团支书竞选稿
2015/11/21 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript