关于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网站提速三大“软”招
Oct 09 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
Django中通过定时任务触发页面静态化的处理方式
Aug 29 PHP
thinkPHP框架实现的简单计算器示例
Dec 07 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
Oct 17 PHP
laravel 解决crontab不执行的问题
Oct 22 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
php4的session功能评述(一)
2006/10/09 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
使用js画图之饼图
2015/01/12 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
高质量Python代码编写的5个优化技巧
2017/11/16 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
枚举与#define宏的区别
2014/04/30 面试题
爱国卫生月实施方案
2014/02/21 职场文书
如何写自我鉴定
2014/03/19 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
大学生求职信怎么写
2015/03/19 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js
Python使用Web框架Flask开发项目
2022/06/01 Python